专栏首页C++核心准则原文翻译自学HarmonyOS应用开发(61)- 使用异步派发任务后台更新地图数据

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

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

我们甚至可以在地图更新过程中拖动地图。

画面更新时记录需要获得的地图数据

以下是描画地图数据的代码:

private void drawTiles(Canvas canvas){
    int tileCol = Tile.getTileX(location.lon, zoom);
    int tileRow = Tile.getTileY(location.lat, zoom);
    Map<Pair<Integer,Integer>, Tile> missingTile = new HashMap<Pair<Integer,Integer>, Tile>();
    Paint paint = new Paint();
    for (int col = tileCol - 1; col <= tileCol + 1; col++) {
        for (int row = tileRow - 1; row <= tileRow + 1; row++) {
            Tile tile = mapData.getData(mapSource, zoom, col, row);
            if (tile != null) {
                Size offset = tile.calculateOffset(location);
                canvas.drawPixelMapHolder(tile,
                        getWidth() / 2 + offset.width,
                        getHeight() / 2 + offset.height,
                        paint);
            } else {
                missingTile.put(new Pair<Integer, Integer>(row, col), null);
            }
        }
    }
    if (missingTile.size() > 0) {
        loadMapTile(missingTile);
    }
}

如果需要的数据不在地图数据缓存中,就将该地图瓦片的坐标存储在missingTile中(代码第16行)。等到本轮描画结束后,调用loadMapTile方法启动后台数据获取过程。

异步获取和更新地图数据

代码第5行启动异步派发任务根据missingTile中存储的坐标获取相应的地图数据。需要注意的是第8行到第18行是在UI以外的上下文中执行的。

public void loadMapTile(Map<Pair<Integer,Integer>, Tile> missingTile){
    if(loadMapTileRevocable != null) {
        return;
    }
    loadMapTileRevocable = getContext().getGlobalTaskDispatcher(TaskPriority.HIGH).asyncDispatch(new Runnable() {
        @Override
        public void run() {
            int tileCol = Tile.getTileX(location.lon, zoom);
            int tileRow = Tile.getTileY(location.lat, zoom);
            boolean need_update = false;
            for(Pair<Integer, Integer> pair : missingTile.keySet()){
                Tile tile = Tile.createTile(mapSource, pair.s, pair.f, zoom);
                if(tile != null) {
                    missingTile.put(pair, tile);
                    need_update = true;
                }
            }
            getContext().getUITaskDispatcher().asyncDispatch(new Runnable() {
                @Override
                public void run() {
                    for(Pair<Integer, Integer> pair : missingTile.keySet()){
                        Tile tile = missingTile.get(pair);
                        if(tile != null){
                            mapData.setData(mapSource, zoom, pair.s, pair.f, tile);
                        }
                    }
                    TileMap.this.invalidate();
                    loadMapTileRevocable = null;
                }
            });
        }
    });
}

代码18行发起一个UI线程中的异步任务将获得的地图数据保存到地图缓存中。之所以没有直接在获取时直接存储是因为需要避免多任务同时访问地图存储。

地图数据保存完了之后,再发起一次画面更新即可。如果还有没有获取的数据,继续上面的过程。

参考代码

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

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

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

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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

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

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

    面向对象思考
  • 自学HarmonyOS应用开发(55)- 使用对象关系映射数据库保存地图数据

    前一篇文章实现了地图数据的正确表示,但是由于每次执行都需要至少一次从网上获取地图数据,不可避免地产生显示延迟。本文介绍利用对象数据库储存已经获取的地图数据,从而...

    面向对象思考
  • HarmonyOS简介

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

    xiangzhihong
  • 技术分析 | HarmonyOS到底是不是Android套皮?

    最近鸿蒙系统关注度好高,支持与反对、看好和看衰、「自主的全场景分布式系统」和「Android套壳」各执一词,吵的不可开交。

    刘盼
  • HarmonyOS与Android的全面对比

    第二是我个人非常看好鸿蒙系统的未来,清楚明白华为和一些民族企业担负的责任和国人的期待,虽然带着一些民族感情;鸿蒙刚发布的时候自己是非常激动的,但是后来项目太忙一...

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

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

    深度学习与Python
  • HarmonyOS 生态,投入还是继续观望?

    HarmonyOS 2.0 从首次亮相至今快满一年,回顾过去一年里的关键节点:2020 年 9 月在华为开发者大会上,HarmonyOS 2.0 首次亮相;20...

    深度学习与Python
  • 程序员看华为HarmonyOS首发

    HarmonyOS代码正式开源,9月10日下午朋友圈散布着这条消息,科技圈炸锅了。各种声音的都有,我也挺好奇的,目前Android、iOS一统江湖,Harmon...

    马上就说
  • 《鸿蒙理论知识04》HarmonyOS概述之系统定义

    【摘要】 系统定位 HarmonyOS 是一款“面向未来”、面向全场景(移动办公、运动健康、社交通信、媒体 娱乐等)的分布式操作系统。在传统的单设备系统能力的基...

    玖柒的小窝
  • 【第22期】HarmonyOS应用开发(基础篇)

    这不就是说,以后华为手机都是鸿蒙系统了嘛?鸿蒙还发出了一条视频,视频中显示2021年6月2号将开启鸿蒙操作系统及华为全场景新品发布会。预计现在支持EMUI11升...

    siberiawolf
  • 基于 Hi3861 平台的 HarmonyOS Device 开发体验

    编程界有个传承了几十年的”规矩“--入门先从环境搭建开始,有的时候环境搭建比较简单,比如学习 HTML 编程,有浏览器就行;有时候又比较繁琐,比如 React ...

    胡琦
  • 带你了解鸿蒙开发基本流程

    2020年9月10号,鸿蒙2.0(HarmonyOS 2.0)系统正式发布,鸿蒙2.0面向应用开发者发布Beta版本,

    Python进击者
  • 搭建鸿蒙编译环境(VMware+Linux)

    分布式软总线是多种终端设备的统一基座,为设备之间的互联互通提供了统一的分布式通信能力,能够快速发现并连接设备,高效地分发任务和传输数据。分布式软总线示意图见。

    跋扈洋
  • 鸿蒙(HarmonyOS)API的源代码去哪了?竟然全抛出异常,原来使用的是虚拟API!

    不管是鸿蒙(HarmonyOS),或是Android、还是其他系统。理解其工作原理最好的方式就是阅读源代码。不过HarmonyOS的所有系统类,跟踪进去,全部是...

    蒙娜丽宁
  • 前端视角看HarmonyOS

    公元 2021 年 6 月 2 日,【 HarmonyOS2.0 】正式发布,以 JavaScript 作为 IoT 应用开发的架构语言,这是继 SpaceX ...

    公众号@魔术师卡颂
  • 【兼容性】监听页面关闭发送请求

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

    神仙朱
  • 万字长文,教你如何发布鸿蒙(HarmonyOS)组件到Maven中央仓库,全网最全教程!

    如果一个鸿蒙(HarmonyOS)App过于庞大,通常不会将所有的代码一股脑地放到一个工程中,最常用的方式是将HarmonyOS App进行分解,...

    蒙娜丽宁
  • 我的HarmonyOS实战——鸿蒙系统初定义

    鸿蒙并不是一个单纯的手机操作系统,而是手机+智能设备的总称。可以安装在包括手机、手表、无人机等很多设备上。

    天道Vax的时间宝藏
  • HarmonyOS-对Android开发者也太友好了吧

    2020年9月10日,华为消费者业务软件部总裁王成录又一次站在了松山湖华为开发者大会的主舞台上。今年,他带来了万众瞩目的华为鸿蒙HarmonyOS2.0...

    Android扫地僧

扫码关注云+社区

领取腾讯云代金券