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

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

new Handler().postDelayed(new Runnable() {
         @Override
         public void run() {

         }
},1000);

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

getUITaskDispatcher().delayDispatch(new Runnable() {
         @Override
         public void run() {
                
         }
},1000);
getMainTaskDispatcher().delayDispatch(new Runnable() {
       @Override
       public void run() {

        }
},1000);

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

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

在这里插入图片描述

以上是我在实战中使用的延迟操作处理,
那么在鸿蒙中,我想要实现定时操作该如何处理呢

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

在安卓中可以通过 Handler 实现

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

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

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

        //发送延迟消息
        eventHandler.sendEvent(1,300);
        //移除所有消息
        eventHandler.removeAllEvent();
    //创建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,妙啊~~~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值