HarmonyOS 鸿蒙Next:有一个播放器需后台运行,切换界面仍存在,class内定时器更新时间但外部text不更新

发布于 1周前 作者 zlyuanteng 来自 鸿蒙OS

HarmonyOS 鸿蒙Next:有一个播放器需后台运行,切换界面仍存在,class内定时器更新时间但外部text不更新

export class Player {
  left: string = ''
  right: string = ''
  timer: number = 0

  constructor() {
    this.timer = setInterval(() => {
      this.left = Math.random().toString()
      this.right = Math.random().toString()
      console.log(`left ${this.left} right ${this.right}`)
    }, 1000)
  }
}

@Entry
@Component
export struct Index {
  @State player: Player = new Player()

  build() {
    NavDestination() {
      Column() {
        Text('left : ' + this.player.left).fontSize('22fp').fontWeight(FontWeight.Bold)
        Text('right : ' + this.player.right).fontSize('22fp').fontWeight(FontWeight.Bold)
      }
    }
  }
}

有一个播放器需要后台运行,在切换界面的时候也存在,在class里边的定时器里边更新时间,但是外边的text不更新。 这种情况有啥好办法。 目前想到的是使用emitter,还有其他好办法吗。


更多关于HarmonyOS 鸿蒙Next:有一个播放器需后台运行,切换界面仍存在,class内定时器更新时间但外部text不更新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

这样操作,class中的变量修改UI也不能更新,若是想更新可以在变量更改的时候把变量值用AppStorage存储起来,在页面使用的时候从AppStorage把值取出来,可以参考如下demo

export class Player {
  left: string = ''
  right: string = ''
  timer: number = 0

  constructor() {
    this.timer = setInterval(() => {
      this.left = Math.random().toString()
      this.right = Math.random().toString()
      AppStorage.setOrCreate('left', this.left)
      AppStorage.setOrCreate('right', this.right)
      console.log(`left ${this.left} right ${this.right}`)
    }, 1000)
  }
}

@Entry
@Component
struct Page241018163529110 {
  [@State](/user/State) message: string = 'Hello World';
  [@State](/user/State) player: Player = new Player()
  @StorageProp('left') left: string = ''
  @StorageProp('right') right: string = ''

  build() {
    Column() {
      Text('left : ' + this.left)
        .fontSize('22fp')
        .fontWeight(FontWeight.Bold)
      Text('right : ' + this.right)
        .fontSize('22fp')
        .fontWeight(FontWeight.Bold)
    }
    .height('100%')
    .width('100%')
  }
}

AppStorage是可以跨页面的,其他页面也是可以取到值的

我看到你提到了emitter,这个也是可以的

像这种定义的类对象,我们是在page页面通过@State修饰的对象去修改值,这个是在类里面修改造成了UI不更新,所以才在类中变量更改的时候通过发射事件让页面进行订阅,或者把更改的值存入 appstorage ,在页面用到的时候再取出来展示。

更多关于HarmonyOS 鸿蒙Next:有一个播放器需后台运行,切换界面仍存在,class内定时器更新时间但外部text不更新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙系统中,若要实现一个播放器在后台运行且切换界面后仍存在,同时class内的定时器能够更新时间但外部text不更新的问题,通常涉及UI更新机制。

鸿蒙系统使用ArkUI框架进行界面开发,若定时器在后台更新了数据但UI未刷新,可能是因为数据绑定或UI更新逻辑有误。检查以下几点:

  1. 数据绑定:确保定时器更新的数据与UI组件正确绑定。使用@State或相应数据绑定机制确保数据变化能触发UI重绘。

  2. UI组件刷新:检查UI组件是否正确响应数据变化。例如,如果使用Text组件显示时间,确保它绑定的数据是最新的。

  3. 生命周期管理:确保播放器及定时器在页面切换时不会被销毁。鸿蒙系统中,页面切换可能会暂停或销毁页面,需要根据需求调整页面生命周期管理。

  4. 异步更新:如果定时器在异步任务中更新数据,确保使用正确的异步更新机制来通知UI组件刷新。

检查以上方面,确保数据更新能正确触发UI变化。如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部