专栏首页C++核心准则原文翻译自学HarmonyOS应用开发(60)- 使用异步延迟派发任务实现操作延时

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

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

动作视频如下:

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

计算无操作时间

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

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

本文分享自微信公众号 - 面向对象思考(OOThinkingDalian),作者:面向对象思考

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-07-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 自学HarmonyOS应用开发(61)- 使用异步派发任务后台更新地图数据

    当第一次表示某地的地图数据时,由于数据需要从网络下载,因此会造成初次表示时间过长而影响响应速度的问题。我们使用异步派发任务解决这个问题。先看显示效果:

    面向对象思考
  • 鸿蒙 线程讲解(任务分发、线程通信)

      说起鸿蒙的线程就不得不说Android的线程,相信都知道在Android中,每一个应用都会有自己的主线程和其他的子线程,主线程负责处理大部分业务,负责UI的...

    晨曦_LLW
  • 【兼容性】监听页面关闭发送请求

    因为前端监控会在页面关闭的时候,发送一下日志,所以会涉及到监听页面关闭,之前我们只监听了一个beforeunload 来发送数据

    神仙朱
  • 解密“达达-京东到家”的订单即时派发技术原理和实践1、前言2、关于作者3、订单即时派发架构的演进5、订单派发方案的具体实现6、结语附录:更多相关技术文章

    达达-京东到家作为优秀的即时配送物流平台,实现了多渠道的订单配送,包括外卖平台的餐饮订单、新零售的生鲜订单、知名商户的优质订单等。为了提升平台的用户粘性,我们需...

    JackJiang
  • 如何在MQ中实现支持任意延迟的消息?

    定时消息与延迟消息在代码配置上存在一些差异,但是最终达到的效果相同:消息在发送到 MQ 服务端后并不会立马投递,而是根据消息中的属性延迟固定时间后才投递给消费者...

    林一
  • 解密“达达-京东到家”的订单即时派发技术原理和实践

    达达-京东到家作为优秀的即时配送物流平台,实现了多渠道的订单配送,包括外卖平台的餐饮订单、新零售的生鲜订单、知名商户的优质订单等。为了提升平台的用户粘性,我们需...

    JackJiang
  • 2019/03面试题-并发为主

      实现interface Runnable的run()  继承class Thread override run()  使用FutureTask的方式(此方式...

    用户1134788
  • [045][译]cfq-iosched.txt

    按照[043][译]blkio-controller.txt,我已经学会了如何通过cgroup v1来调整不同进程的IO权重,这个IO权重是在CFQ调度算法中实...

    王小二
  • 这里有一批Dubbo中你不知道的操作方式

    在开发及测试环境下,使用点对点直连方式,可以直接绕过绕过注册中心,只测试指定的服务提供者

    Java学习录
  • Changes in GreatSQL 8.0.25 (2021-8-26)

    可以对每个节点设置地理标签,主要用于解决多机房数据同步的问题。新增选项 group_replication_zone_id,用于标记节点地理标签。该选项值支持范...

    老叶茶馆
  • [Objective-C]多线程和GCD

    是指在系统中正在运行的一个应用程序。 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内。 比如同时打开QQ、Xcode,系统就会分别启动两个进程...

    wOw
  • 十问华为HarmonyOS:开源一个月,开发者生态建设进度如何?

    基础软件的开源面临着非常大的挑战,除了技术研发困难重重,开源生态和社区的建设更是难上加难。9 月 10 日,在华为开发者大会 2020 上,华为消费者业务 CE...

    深度学习与Python
  • [从源码学设计]蚂蚁金服SOFARegistry 之 自动调节间隔周期性任务

    SOFARegistry 是蚂蚁金服开源的一个生产级、高时效、高可用的服务注册中心。

    罗西的思考
  • 订单付款倒计时实现方案

     如何实现付款及时呢,首先用户下单后,存储用户的下单时间。下面介绍四种系统自动取消订单的方案:

    Java架构师必看
  • MongoDB 读写分离异常案例分析

    双11当天临近下班时间点,研发反馈出现应用定时JOB跑批任务卡死,导致数据没有及时计算出来,影响一次报表数据展示,这个功能跑了几个月基本上没有异常,双11业务增...

    MongoDB中文社区
  • RabbitMQ实现延迟消息居然如此简单,整个插件就完事了!

    学习本文需要对RabbitMQ有所了解,还不了解的朋友可以看下:《花了3天总结的RabbitMQ实用技巧,有点东西!》

    macrozheng
  • 最佳案例分享 | MongoDB读写分离异常案例分析

    本文为2020年MongoDB应用案例与解决方案征集活动最佳创新案例:MongoDB在圆通速递的应用,作者徐靖。

    MongoDB中文社区
  • HarmonyOS简介

    前两天,华为发布了HarmonyOS 2.0,俺也赶个时髦,给大家简单介绍下HarmonyOS。

    xiangzhihong
  • OpenAI/Universe-万物

    用户1107453

扫码关注云+社区

领取腾讯云代金券