鸿蒙实现类似于安卓的Handler,鸿蒙的延迟和异步操作

在安卓开发的时候我们想要去延迟处理一些事情可以通过 Handler 解决,比如一秒后处理某些事情:

java 复制代码
new Handler().postDelayed(new Runnable() {
         @Override
         public void run() {

         }
},1000);

鸿蒙也提供了类似的方法,如下:

java 复制代码
getUITaskDispatcher().delayDispatch(new Runnable() {
         @Override
         public void run() {
                
         }
},1000);
java 复制代码
getMainTaskDispatcher().delayDispatch(new Runnable() {
       @Override
       public void run() {

        }
},1000);

通过字面意思大体理解到 TaskDispatcher 是一个任务分发,结合前面getUI 和 getMain 那我基本可以理解为这是一个在主线和视图线的多任务处理机制,毫无疑问,我可以通过以上方法切换到主线程, 通过源码可以看到,还有其他方法也会返回 任务方法,作用于可看下其他博主的文章,还是比较明了的 传送门

如果你的源码里没有 Main 和 UI 那可以看下当前的API版本是否为6,这里我为了适配更多设备,以及能通过Java开发,在项目创建时选择了 API 6 作为开发 具体如下 传送门

以上是我在实战中使用的延迟操作处理,

那么在鸿蒙中,我想要实现定时操作该如何处理呢

  1. 使用Timer定时器(不使用时及时销毁) 如下:
java 复制代码
 //创建定时器Timer
Timer mTimer = new Timer();
//开启定时
mTimer.schedule(new TimerTask() {
      @Override
      public void run() {
      
       }
 },500,1000);
//取消定时器
mTimer.cancel();
  1. 上述 Timer 适合相对固定的定时逻辑,项目中我使用到了类似于 一秒一次定时,当到达规定数量之后在五秒开始定时

在安卓中可以通过 Handler 实现

java 复制代码
        //创建Handler
        Handler handler = new Handler();
        //直接发送
        handler.post(mQuery);
        //延迟发送
        handler.postDelayed(mQuery, 1000);
        //清除消息
        handler.removeCallbacks(mQuery);
java 复制代码
    Runnable mQuery = new Runnable() {

        @Override
        public void run() {
            handler.postDelayed(mQuery,5000);
        }
    };

那么鸿蒙中该如何处理呢,我是这样处理的:

java 复制代码
        //发送延迟消息
        eventHandler.sendEvent(1,300);
        //移除所有消息
        eventHandler.removeAllEvent();
java 复制代码
    //创建EventHandler通讯处理器
    private EventHandler eventHandler = new EventHandler(EventRunner.create()){
        @Override
        protected void processEvent(InnerEvent event) {
            super.processEvent(event);
            eventHandler.sendEvent(1,5000);

        }
    };

这个EventHandler是个啥捏,(复制来的)EventHandler是HarmonyOS用于处理线程间通信的一种机制,可以通过EventRunner创建新线程,将耗时的操作放到新线程上执行。这样既不阻塞原来的线程,任务又可以得到合理的处理。

回到上面的代码 eventHandler.sendEvent(1,300); 后面 300 我可以理解是时间,前面这个 1 是什么玩意

再看源码前,我们先看下接收回调里面的参数 InnerEvent

在看下sendEvent源码:

那应该就是正常我要传回调里面的 InnerEvent 数据类,但是我要人性化一点,你可以只传一个 eventId 给我,我在源码里面给你塞上数据,因为我就要 eventId 来区分哪里传来的消息(这里我是统一处理的,所以随便写一个凑个整),这里又类似于 安卓的 EventBus,妙啊~~~~~

相关推荐
动物园猫4 分钟前
Flutter 鸿蒙实战:用 webview_flutter 三方库在 鸿蒙 中内嵌真实网页
flutter·华为·harmonyos
李游Leo1 小时前
HarmonyOS 闪控窗开发复盘:从入口触发到窗口状态管理的完整落地【鸿蒙心迹】
华为·harmonyos
Sunny_G1 小时前
所见即所得编辑器原理实战:源码与渲染永不失真的三层一致性设计(Markdown/CodeMirror 装饰)
ai编程·harmonyos
less_121381 小时前
HarmonyOS WPS Open SDK 二开实践:统一接口如何收敛多套打开链路
sdk·harmonyos·wps·鸿蒙开发
m0_738185822 小时前
Flutter 鸿蒙化实战:flutter_app_badger 适配 OpenHarmony,应用角标
flutter·华为·harmonyos·鸿蒙
袁震3 小时前
HarmonyOS 7 深色模式与全局换肤实战:一套色板管到底
华为·harmonyos
李游Leo4 小时前
《HarmonyOS 7 ArkGraphics 3D 空间设计开发实战》05:Camera控制、手势映射与空间浏览交互【鸿蒙心迹】
3d·交互·harmonyos
resh_people4 小时前
开源鸿蒙平台 KMP/CMP 三方库「Okio」适配全流程
华为·开源·harmonyos
李游Leo5 小时前
《HarmonyOS 7 ArkGraphics 3D 空间设计开发实战》08:动画、生命周期与SpaceRoom工程化收尾【鸿蒙心迹】
3d·harmonyos
-madongyu-5 小时前
HCIE-GaussDB V2.0 笔试考点总览:模块权重、核心要点与高频数字速记
数据库·华为·gaussdb