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

相关推荐
SoraLuna3 小时前
「Mac畅玩鸿蒙与硬件28」UI互动应用篇5 - 滑动选择器实现
macos·ui·harmonyos
ClkLog-开源埋点用户分析4 小时前
ClkLog企业版(CDP)预售开启,更有鸿蒙SDK前来助力
华为·开源·开源软件·harmonyos
mg6684 小时前
鸿蒙系统的优势 开发 环境搭建 开发小示例
华为·harmonyos
模拟IC攻城狮5 小时前
华为海思招聘-芯片与器件设计工程师-模拟芯片方向- 机试题-真题套题题目——共8套(每套四十题)
嵌入式硬件·华为·硬件架构·芯片
lqj_本人5 小时前
鸿蒙next选择 Flutter 开发跨平台应用的原因
flutter·华为·harmonyos
lqj_本人5 小时前
使用 Flutter 绘制一个棋盘
harmonyos
TangKenny5 小时前
计算网络信号
java·算法·华为
23zhgjx-NanKon6 小时前
华为eNSP:QinQ
网络·安全·华为
23zhgjx-NanKon6 小时前
华为eNSP:mux-vlan
网络·安全·华为
Leo.yuan7 小时前
39页PDF | 华为数据架构建设交流材料(限免下载)
数据结构·华为