首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自学HarmonyOS应用开发(60)- 使用异步延迟派发任务实现操作延时

自学HarmonyOS应用开发(60)- 使用异步延迟派发任务实现操作延时

作者头像
面向对象思考
发布2021-08-06 13:14:34
5130
发布2021-08-06 13:14:34
举报

当我们使用地图功能实时跟踪设备位置的时候,一般会希望保证可以显示最新位置。但也有可能操作者希望确认周边信息而暂时脱离最新位置,等周边信息确认完成之后再自动回到最新位置。

动作视频如下:

我们通过发布异步延迟派发任务来实现这个功能。

计算无操作时间

我们准备一个定时器,每当用户对屏幕进行操作时更新最后操作时刻。

void resetOperationTimer(){
    lastOperation = Calendar.getInstance().getTimeInMillis();
}

在需要检查时,将当前时刻和最后的操作时刻进行比较就可以判断是否超过操作延时时长了。

boolean isOperationTimeout(){
    return (Calendar.getInstance().getTimeInMillis() - lastOperation) > operationTimeout;
}

发布异步延迟派发任务

在重置最后操作时刻时我们同时发行一个异步延迟派发任务:

void reserveInvalidate(){
    TaskDispatcher uiTaskDispatcher = mContext.getUITaskDispatcher();
    Revocable revocable = uiTaskDispatcher.delayDispatch(new Runnable() {
        @Override
        public void run() {
            visibleAreaCheck();
        }
    }, operationTimeout);
}

void visibleAreaCheck(){
    //如果最新位置超出显示位置
    if (lastLocation != null && isOperationTimeout()){
        Rect bound = new Rect(0, 0, getWidth(), getHeight());
        Size offset = Tile.calculateOffset(512, zoom, location, lastLocation);
        int x = getWidth() / 2 + offset.width;
        int y = getHeight() / 2 + offset.height;
        if(!bound.isInclude(x, y)) {
            location = lastLocation;
            invalidate();
        }
    }
}

有几点需要注意:

  1. 这个任务是发布到UI线程的,这样的好处是不必考虑多线程之间的上下文切换。
  2. 如果在进行可视范围检查时,时间差没有达到事先指定的时长,那就意味着中间又发生了新的操作,则本次检查取消。也就是说,只要操作继续就不会发生显示位置重置。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-07-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 面向对象思考 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档