• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# ArkUI数据更新场景
2<!--Kit: ArkTS-->
3<!--Subsystem: CommonLibrary-->
4<!--Owner: @lijiamin2025-->
5<!--Designer: @weng-changcheng-->
6<!--Tester: @kirl75; @zsw_zhushiwei-->
7<!--Adviser: @ge-yafang-->
8
9当需要网络下载或者本地生成的数据需要发送到UI线程进行展示时,由于ArkUI的标注和[\@Sendable装饰器](../arkts-utils/arkts-sendable.md#sendable装饰器)不能同时修饰变量和对象,因此需要使用[makeObserved](../ui/state-management/arkts-new-makeObserved.md)在ArkUI中导入可观察的Sendable共享数据。
10
11本示例说明以下场景:
12- makeObserved在传入@Sendable类型的数据后有观察能力,且其变化可以触发UI更新。
13- 从子线程获取数据,整体替换UI线程的可观察数据。
14- 从子线程获取的数据重新执行makeObserved,变为可观察数据。
15- 将数据从UI主线程传递回子线程时,只传递不可观察的数据。makeObserved的返回值不能直接传给子线程。
16
17```ts
18// SendableData.ets
19@Sendable
20export class SendableData {
21  name: string = 'Tom';
22  age: number = 20;
23  gender: number = 1;
24  likes: number = 1;
25  follow: boolean = false;
26}
27```
28<!-- @[define_sendable_class](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/ArkTsConcurrent/ApplicationMultithreadingDevelopment/PracticalCases/entry/src/main/ets/managers/SendableData.ets) -->
29
30```ts
31import { taskpool } from '@kit.ArkTS';
32import { SendableData } from './SendableData';
33import { UIUtils } from '@kit.ArkUI';
34
35@Concurrent
36function threadGetData(param: string): SendableData {
37  // 在子线程处理数据
38  let ret = new SendableData();
39  console.info(`Concurrent threadGetData, param ${param}`);
40  ret.name = param + "-o";
41  ret.age = Math.floor(Math.random() * 40);
42  ret.likes = Math.floor(Math.random() * 100);
43  return ret;
44}
45
46@Entry
47@ComponentV2
48struct Index {
49  // 通过makeObserved给普通对象或是Sendable对象添加可观察能力
50  @Local send: SendableData = UIUtils.makeObserved(new SendableData());
51
52  build() {
53    Column() {
54      Text(this.send.name)
55      Button("change name").onClick(() => {
56        // 可以观察到属性的改变
57        this.send.name += "0";
58      })
59
60      Button("task").onClick(() => {
61        // 将待执行的函数放入taskpool内部任务队列等待,等待分发到工作线程执行。
62        // 因为数据的构建和处理可以在子线程中完成,但有观察能力的数据不能传给子线程,只有在UI主线程里才可以操作可观察的数据。
63        // 所以这里只是将`this.send`的属性`name`传给子线程操作。
64        taskpool.execute(threadGetData, this.send.name).then(val => {
65          // 和@Local一起使用,可以观察this.send的变化
66          this.send = UIUtils.makeObserved(val as SendableData);
67        })
68      })
69    }
70  }
71}
72```
73<!-- @[update_arkui_data](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/ArkTsConcurrent/ApplicationMultithreadingDevelopment/PracticalCases/entry/src/main/ets/managers/MakeobservedSendable.ets) -->