首页 文章详情

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

面向对象思考 | 205 2021-07-26 22:43 0 0 0
UniSMS (合一短信)

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

动作视频如下:

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


计算无操作时间

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

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. 如果在进行可视范围检查时,时间差没有达到事先指定的时长,那就意味着中间又发生了新的操作,则本次检查取消。也就是说,只要操作继续就不会发生显示位置重置。


参考代码

完整代码可以从以下链接下载:

https://github.com/xueweiguo/Harmony/tree/master/StopWatch


作者著作介绍

《实战Python设计模式》是作者去年3月份出版的技术书籍,该书利用Python 的标准GUI 工具包tkinter,通过可执行的示例对23 个设计模式逐个进行说明。这样一方面可以使读者了解真实的软件开发工作中每个设计模式的运用场景和想要解决的问题;另一方面通过对这些问题的解决过程进行说明,让读者明白在编写代码时如何判断使用设计模式的利弊,并合理运用设计模式。

对设计模式感兴趣而且希望随学随用的读者通过本书可以快速跨越从理解到运用的门槛;希望学习Python GUI 编程的读者可以将本书中的示例作为设计和开发的参考;使用Python 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础,迅速构建自己的系统架构。




觉得本文有帮助?请分享给更多人。

关注微信公众号【面向对象思考】轻松学习每一天!

面向对象开发,面向对象思考!



good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter