在安卓开发的时候我们想要去延迟处理一些事情可以通过 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 作为开发 具体如下 传送门
以上是我在实战中使用的延迟操作处理,
那么在鸿蒙中,我想要实现定时操作该如何处理呢
- 使用Timer定时器(不使用时及时销毁) 如下:
java
//创建定时器Timer
Timer mTimer = new Timer();
//开启定时
mTimer.schedule(new TimerTask() {
@Override
public void run() {
}
},500,1000);
//取消定时器
mTimer.cancel();
- 上述 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,妙啊~~~~~