鸿蒙实现类似于安卓的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,妙啊~~~~~

相关推荐
行者-全栈开发8 小时前
【鸿蒙心迹】深色模式适配全链路——从配置到自定义(HarmonyOS 7.x)
华为·harmonyos
行者-全栈开发18 小时前
【鸿蒙心迹】国际化 i18n 与多语言资源管理实战(HarmonyOS 7.x)
ui·华为·重构·国际化·harmonyos·多语言
OH_TPC20 小时前
HarmonyOS APP开发---"云客服"远程视频客服App,需要用到这个库
harmonyos
逆回2 天前
给鸿蒙手机做一只 3D 宠物:五个把我卡住的问题
harmonyos
钉先生贾2 天前
性能、体积与稳定性:怎样写出可信的适配结论
华为·harmonyos
笑 总不会犯错2 天前
摆脱多端数据撕裂,鸿蒙分布式数据库同步与冲突合并
harmonyos
用户117910488332 天前
鸿蒙签名失败不是玄学:5 个证据点把 hapsigntool 一次排通 GitHub:swsgbl/hmharness
开源·ai编程·harmonyos
redtank20002 天前
纯血鸿蒙小工具三件套实测:弹幕手持、爱记录与仓库管理软件
学习·华为·智能手机·harmonyos
xyzzklk2 天前
变相解决华为Mate 8锁屏后无法建立入站网络连接
linux·运维·服务器·网络·华为·go·安卓
用户86194177207413 天前
uni-app 的蓝牙 API 在鸿蒙上不生效?我写了个兼容层,让老代码零改动跑起来
harmonyos