您现在的位置是:亿华云 > 人工智能
ActiveData在HarmonyOS中的原理分析和运用
亿华云2025-10-03 16:01:42【人工智能】2人已围观
简介想了解更多内容,请访问:和华为官方合作共建的鸿蒙技术社区https://harmonyos.51cto.com在讲解ActiveData实现原理之前,我们有必要先了解一下两个重要的类Lifecycle
想了解更多内容,理分请访问:
和华为官方合作共建的析和鸿蒙技术社区
https://harmonyos.51cto.com
在讲解ActiveData实现原理之前,我们有必要先了解一下两个重要的运用类Lifecycle以及DataObserver,这两个类在ActiveData整个运行过程中扮演了非常重要的理分角色。
Lifecycle提供了观察Ability和AbilitySlice的析和生命周期能力 DataObserver通过持有一个Lifecycle对象来观察Ability或者AbilitySlice的生命周期变化,同时DataObserver还允许ActiveData观察其生命周期变化,运用因此DataObserver和ActiveData相互观察,理分DataObserver观察ActiveData的析和数据变化,ActiveData观察DataObserver的运用生命周期变化。ActiveData作用和特点
ActiveData是理分一个具有感知生命周期能力变化的数据通知类组件,非常适合在一些对数据同步性较高的析和场景下使用,它具有以下三个特点。运用
基于观察者模式:
ActiveData是理分一个持有可被观察数据的类,ActiveData需要一个观察者对象,析和一般是运用DataObserver类的具体实现。
感知生命周期:
ActiveData具有生命周期感知能力,目前ActiveData具有两种通知模式,云服务器一种是Ability/AbilitySlice生命周期是活跃(ACTIVE)状态时才更新数据,另一种是Ability/AbilitySlice生命周期处于任何存活状态(即只要没有被销毁)都可以更新数据。
自动解除数据订阅:
ActiveData必须配合实现了Lifecycle的对象使用。当Ability/AbilitySlice被销毁(STOP状态)后,会自动解除订阅,这在一定程度上可以避免内存泄漏等问题。
实践
1.基础用法
public class MainAbilitySlice extends AbilitySlice { private ActiveData<String> activeData; private Text mText; private final DataObserver<String> dataObserver = new DataObserver<String>() { @Override public void onChanged(String s) { mText.setText(s); } }; @Override public void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_ability_main); activeData = new ActiveData<>(); dataObserver.setLifecycle(getLifecycle()); mText = (Text) findComponentById(ResourceTable.Id_text_helloworld); subscribe(); } private void subscribe() { activeData.addObserver(dataObserver, true); } @Override public void onActive() { super.onActive(); activeData.setData("New Hello World"); } }运行之后的截图:

从运行结果可以看出,setData调用后会立即触发onChanged回调方法
2.主线程手动调用
// 添加如下代码测试DataObserver的onChanged方法是否会执行 findComponentById(ResourceTable.Id_button) .setClickedListener(component -> activeData.setData("I Love China"));运行结果如下:

从运行结果我们可以看到,onChanged方法会一直触发,并不会因为值相同而不执行,虽然暂时看不了鸿蒙源码,但我们可以大胆猜测,鸿蒙底层维护了一个类似于版本号的标记,每次setData,该标记会自动+1,从而通过此版本号来判断data是否有变化,进而决定是否触发onChanged回调方法。
3.子线程调用
@Override public void onActive() { super.onActive(); new Thread(() -> activeData.setData("New Hello World")).start(); }4.运行后发现没有问题,可以正常调用,说明setData方法可以在子线程调用。云南idc服务商
public class MainAbilitySlice extends AbilitySlice { private ActiveData<String> activeData; private ActiveData<String> activeData2; private Text mText; private final DataObserver<String> dataObserver = new DataObserver<String>() { @Override public void onChanged(String s) { mText.setText(s); System.out.println("ActiveData:---onChange:"+s); } }; private final DataObserver<String> dataObserver2 = new DataObserver<String>() { @Override public void onChanged(String s) { mText.setText(s); System.out.println("ActiveData:---onChange:"+s); } }; @Override public void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_ability_main); activeData = new ActiveData<>(); activeData2 = new ActiveData<>(); dataObserver.setLifecycle(getLifecycle()); dataObserver2.setLifecycle(getLifecycle()); mText = (Text) findComponentById(ResourceTable.Id_text_helloworld); findComponentById(ResourceTable.Id_button) .setClickedListener(component -> activeData.setData("I Love China")); findComponentById(ResourceTable.Id_addObserver_true).setClickedListener(component -> { System.out.println("ActiveData:-------------"); Intent intent1 = new Intent(); Operation operation = new Intent.OperationBuilder() .withDeviceId("") .withBundleName(getBundleName()) .withAbilityName(SecondAbility.class.getName()) .build(); intent1.setOperation(operation); startAbility(intent1); // 此处是为了验证Ability在inActive状态的值的变化情况 new EventHandler(EventRunner.getMainEventRunner()).postTask(() -> activeData.setData("New Hello World"), 2000); }); findComponentById(ResourceTable.Id_addObserver_false).setClickedListener(component -> { System.out.println("ActiveData:-------------"); Intent intent1 = new Intent(); Operation operation = new Intent.OperationBuilder() .withDeviceId("") .withBundleName(getBundleName()) .withAbilityName(SecondAbility.class.getName()) .build(); intent1.setOperation(operation); startAbility(intent1); // 此处是为了验证Ability在inActive状态的值的变化情况 new EventHandler(EventRunner.getMainEventRunner()).postTask(() -> activeData2.setData("New Hello World"), 2000); }); subscribe(); } private void subscribe() { activeData.addObserver(dataObserver, true); activeData2.addObserver(dataObserver, false); } @Override public void onActive() { super.onActive(); System.out.println("ActiveData:---onActive"); } @Override protected void onInactive() { super.onInactive(); System.out.println("ActiveData:---onInactive"); } @Override protected void onBackground() { super.onBackground(); System.out.println("ActiveData:---onBackground"); } @Override public void onForeground(Intent intent) { super.onForeground(intent); System.out.println("ActiveData:---onForeground"); } }运行效果如下:
从以上运行结果,可以看出addObserver(dataObserver, true/false)方法的特点,当为true是表示无论Ability/AbilitySlice处于任何生命周期状态,均会触发onChanged回调方法,当为false时表示Ability/AbilitySlice只有处于ACTIVE状态时才会触发onChanged方法。
总结
ActiveData内部是依靠Lifecycle来感知组件的生命周期,从而可以避免内部泄漏 开发者无需维护observer对象,当Ability/AbilitySlice被销毁时,相关联的observer会被自动移除 当Ability/AbilitySlice处于活跃(ACTIVE)状态时,当ActiveData数据源发生变化时onChanged方法会立即触发,去更新UI或者执行我们想要的任何操作 setData方法可在任意线程中去调用,开发者无需关心调用者是否在主线程中 setData方法即使设置同样的数据对象,onChanged方法仍然会被触发想了解更多内容,请访问:
和华为官方合作共建的鸿蒙技术社区
https://harmonyos.51cto.com
很赞哦!(3)
相关文章
- 数据中心的电力需求使伦敦的新房建设更加困难
- 第六:这个圈子里的域名确实是赚钱的一些大玩家,至于小米农,有多少赚钱?几乎没有,也就是说,轿子里只有一个人,而且大多数人都抬着轿子。
- 第三,.cc域名域名也有很多优势资源域名,从整体注册基数也可以由此推断;
- 在数以亿计的网站中,我们应该抓住每一个可能带来宣传的机会,域名可以带有企业的名字,一般可以使用汉语拼音或者英语单词或者是相关缩写的形式,只要用户记住了你企业的名字,就能很容易的打出你的网站域名,同样的,记住了网站域名也能很快的记住你公司的名字。
- 新华三集团邓伟:以全栈智慧教育能力,赋能教育行业数字化转型
- 6、提示添加成功,点击确认进行最后的确定操作。一般10分钟就解析生效,可以用域名进行访问了。
- .com域名是国际最广泛流行的通用域名,目前全球注册量第一的域名,公司企业注册域名的首选。国际化公司通常会注册该类域名。
- 用户邮箱的静态密码可能已被钓鱼和同一密码泄露。在没有收到安全警报的情况下,用户在适当的时间内不能更改密码。在此期间,攻击者可以随意输入帐户。启用辅助身份验证后,如果攻击者无法获取移动电话动态密码,他将无法进行身份验证。这样,除非用户的电子邮件密码和手机同时被盗,否则攻击者很难破解用户的邮箱。
- 步入AI新纪元:全新沃尔沃EX90 SUV基于NVIDIA DRIVE打造而成
热门文章
站长推荐
数据中心光缆安装四大要点
最后提醒我们,域名到期后要及时更新域名,否则可能会丢掉域名,每次抢先注册都不会成功。
4、参加域名拍卖会
公司名字不但要与其经营理念、活动识别相统一,还要能反映公司理念,服务宗旨、商品形象,从而才能使人看到或听到公司的名称就能产生愉快的联想,对商店产生好感。这样有助于公司树立良好的形象。
亚马逊推出新 AI 量子芯片 Trainium2 及 Graviton4 处理器,以应对微软竞争
付款完成后,您只需耐心等待,如果您注册成功,系统会提示您。这里需要注意的是,域名是一个即时产品,只有在最终付款成功时才能预订,注册成功后不能更改。
一下域名,看有没有显示出你所解析的IP,如果有,就说明解析是生效的;如果没有,就说明解析是不生效的。
什么样的邮箱才是安全的电子邮件地址?