首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Android片段活动上绘制b/n两个点的路由

在Android片段活动上绘制b/n两个点的路由,可以通过使用Google Maps API来实现。以下是一个完善且全面的答案:

在Android开发中,可以使用Google Maps API来绘制b/n两个点的路由。Google Maps API是一组由Google提供的开发工具,可以在Android应用中集成地图功能。

首先,需要在Android项目中添加Google Maps API的依赖。可以在项目的build.gradle文件中添加以下代码:

代码语言:txt
复制
implementation 'com.google.android.gms:play-services-maps:17.0.0'

接下来,在AndroidManifest.xml文件中添加以下权限:

代码语言:txt
复制
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

然后,在片段活动的布局文件中添加一个地图视图:

代码语言:txt
复制
<fragment
    android:id="@+id/map_fragment"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

在片段活动的Java代码中,需要获取地图实例并设置一些属性,然后使用Google Maps Directions API来获取b/n两个点之间的路由信息,并在地图上绘制出来。

首先,在片段活动的onViewCreated方法中获取地图实例:

代码语言:txt
复制
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map_fragment);
    mapFragment.getMapAsync(this);
}

然后,在onMapReady回调方法中设置地图属性并获取路由信息:

代码语言:txt
复制
@Override
public void onMapReady(GoogleMap googleMap) {
    // 设置地图属性
    googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    googleMap.getUiSettings().setZoomControlsEnabled(true);

    // 获取路由信息
    LatLng origin = new LatLng(latitude1, longitude1); // 起点坐标
    LatLng destination = new LatLng(latitude2, longitude2); // 终点坐标

    String url = getDirectionsUrl(origin, destination);
    DownloadTask downloadTask = new DownloadTask();
    downloadTask.execute(url);
}

接下来,需要实现一个异步任务来下载路由信息:

代码语言:txt
复制
private class DownloadTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... url) {
        String data = "";

        try {
            data = downloadUrl(url[0]);
        } catch (Exception e) {
            Log.d("Background Task", e.toString());
        }

        return data;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        ParserTask parserTask = new ParserTask();
        parserTask.execute(result);
    }
}

然后,需要实现一个异步任务来解析路由信息并在地图上绘制出来:

代码语言:txt
复制
private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String, String>>>> {
    @Override
    protected List<List<HashMap<String, String>>> doInBackground(String... jsonData) {
        JSONObject jsonObject;
        List<List<HashMap<String, String>>> routes = null;

        try {
            jsonObject = new JSONObject(jsonData[0]);
            DirectionsJSONParser parser = new DirectionsJSONParser();
            routes = parser.parse(jsonObject);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return routes;
    }

    @Override
    protected void onPostExecute(List<List<HashMap<String, String>>> result) {
        ArrayList<LatLng> points = null;
        PolylineOptions polylineOptions = null;

        for (int i = 0; i < result.size(); i++) {
            points = new ArrayList<>();
            polylineOptions = new PolylineOptions();

            List<HashMap<String, String>> path = result.get(i);

            for (int j = 0; j < path.size(); j++) {
                HashMap<String, String> point = path.get(j);

                double lat = Double.parseDouble(point.get("lat"));
                double lng = Double.parseDouble(point.get("lng"));
                LatLng position = new LatLng(lat, lng);

                points.add(position);
            }

            polylineOptions.addAll(points);
            polylineOptions.width(10);
            polylineOptions.color(Color.BLUE);
        }

        if (polylineOptions != null) {
            googleMap.addPolyline(polylineOptions);
        }
    }
}

最后,需要实现一个DirectionsJSONParser类来解析路由信息:

代码语言:txt
复制
public class DirectionsJSONParser {
    public List<List<HashMap<String, String>>> parse(JSONObject jsonObject) {
        List<List<HashMap<String, String>>> routes = new ArrayList<>();
        JSONArray jsonArrayRoutes, jsonArrayLegs, jsonArraySteps;

        try {
            jsonArrayRoutes = jsonObject.getJSONArray("routes");

            for (int i = 0; i < jsonArrayRoutes.length(); i++) {
                jsonArrayLegs = ((JSONObject) jsonArrayRoutes.get(i)).getJSONArray("legs");
                List<HashMap<String, String>> path = new ArrayList<>();

                for (int j = 0; j < jsonArrayLegs.length(); j++) {
                    jsonArraySteps = ((JSONObject) jsonArrayLegs.get(j)).getJSONArray("steps");

                    for (int k = 0; k < jsonArraySteps.length(); k++) {
                        String polyline = (String) ((JSONObject) ((JSONObject) jsonArraySteps.get(k)).get("polyline")).get("points");
                        List<LatLng> list = decodePolyline(polyline);

                        for (int l = 0; l < list.size(); l++) {
                            HashMap<String, String> hashMap = new HashMap<>();
                            hashMap.put("lat", Double.toString(list.get(l).latitude));
                            hashMap.put("lng", Double.toString(list.get(l).longitude));
                            path.add(hashMap);
                        }
                    }
                }

                routes.add(path);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return routes;
    }

    private List<LatLng> decodePolyline(String encoded) {
        List<LatLng> poly = new ArrayList<>();
        int index = 0, len = encoded.length();
        int lat = 0, lng = 0;

        while (index < len) {
            int b, shift = 0, result = 0;

            do {
                b = encoded.charAt(index++) - 63;
                result |= (b & 0x1f) << shift;
                shift += 5;
            } while (b >= 0x20);

            int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
            lat += dlat;

            shift = 0;
            result = 0;

            do {
                b = encoded.charAt(index++) - 63;
                result |= (b & 0x1f) << shift;
                shift += 5;
            } while (b >= 0x20);

            int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
            lng += dlng;

            LatLng point = new LatLng((double) lat / 1E5, (double) lng / 1E5);
            poly.add(point);
        }

        return poly;
    }
}

以上就是在Android片段活动上绘制b/n两个点的路由的完善且全面的答案。通过使用Google Maps API,可以轻松地在Android应用中实现地图功能,并绘制b/n两个点之间的路由。如果需要更详细的信息,可以参考腾讯云相关产品和产品介绍链接地址。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android 知识简记:资深架构师带你快速回顾Android各种知识!

从工作分摊和绘制机制两个方面优化了绘制速度 Handler、MessageQueue、Looper Handler:开发直接接触类,内部持有 MessageQueue 和 Looper MessageQueue...优化绘制过程,避免 Draw 中频繁创建对象、做耗时操作 内存泄漏场景及规避 1.静态变量、单例强引跟生命周期相关数据或资源,包括 EventBus 2.游标、IO 流等资源忘记主动释放 3....转发+赞+关注,第一时间获取最新知识 Android架构师之路很漫长,一起共勉吧! ---- 以下墙裂推荐阅读!!! Android学习笔记参考(敲黑板!!)...“寒冬未过”,阿里P9架构分享Android必备技术,让你offer拿到手软! 毕业3年,我是如何从年薪10W拖拽工程师成为30W资深Android开发者!...腾讯T3大牛带你了解 2019 Android开发趋势及必备技术! 八年Android开发,从码农到架构师分享我技术成长之路,共勉! 最后祝大家生活愉快~

87630

字节跳动年前再招聘1W+人,距离大厂 Offer,你还差这篇Android干货!

,硬件加速: 将 cpu 一部分工作分担给 gpu ,使用 gpu 完成绘制工作 从工作分摊和绘制机制两个方面优化了绘制速度 Handler、MessageQueue、Looper Handler:开发直接接触类...:AIDL 接口实质上是系统提供给我们可以方便实现 BInder 工具 Android Interface Definition Language,可实现跨进程调用方法 服务端:将暴漏给客户端接口声明...优化绘制过程,避免 Draw 中频繁创建对象、做耗时操作 内存泄漏场景及规避 1.静态变量、单例强引跟生命周期相关数据或资源,包括 EventBus 2.游标、IO 流等资源忘记主动释放 3.界面相关动画在界面销毁时及时暂停...生成路由表,即路由与 Activity 映射关系 6、音视频&FFmpeg&播放器 FFmpeg 基于命令方式实现了一个音视频编辑 App: https://github.com/yhaolpz/FFmpegCmd...有些晦涩,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。 客户端开发知识就那么多,面试问来问去还是那么东西。

70600
  • Android OpenGL ES 基础原理

    Rouse 读完需要 11 分钟 速读仅需 4 分钟 由于5G发展,现在音视频越来越流行,我们生活已经完全被抖音、视频号、B站等视频应用所包围。从这一也能看到音视频重要性。...坐标 Android中通过Canvas进行绘制坐标原点是屏幕左上角,同时它坐标范围都是以屏幕宽高来定义。...形状与方向 OpenGL ES中,绘制形状都是以三角形为基础,也就是说它必须由3个或者以上点来进行绘制。所以它是由多个三角形进行组合成特定形状,经过不同程度交叉与重叠来达到不同形状。...创建GL程序之前,我们先来了解顶点着色器与片段着色器。 着色器源码 GL程序渲染过程中需要确认顶点位置与对应颜色,而这两个部分分别借助于顶点与片段着色器来实现。...可修饰声明顶点、颜色等数据 uniform:顶点着色器与片段着色器共享数据,程序中值不变,初始值由程序外部传入 varying:顶点着色器输入,片段着色器输出;由顶点着色器传输给片段着色器中插值数据

    97330

    Android OpenGL ES(三)-平面图形

    上一章Android OpenGL ES(二)-正交投影 学习,我们已经能够画正常图片图形了,这章我们会继续来绘制正方形和圆这样平面图形和绘制纹理。...使用GLES20.GL_TRIANGLE_STRIP可以定义3个的确定三角形情况下,每多一个,就多绘制一个三角形。这种方式需要注意数组中点顺序。 1. 修改矩阵数组。...二维纹理坐标.png 对比Android系统Y轴 android系统中y轴也是向下。但是纹理坐标是向上。 纹理大小 标准OpenGL ES 2.0中,纹理不必是正方形。...渲染时,会更具每个片段纹理元素数量为每个片段选择最合适级别。 缺点 会占用很多内存,但是有点 优点 同时渲染也会更快。是因为较小界别的纹理GPU纹理缓存中占用较少空间。...Android屏幕Y坐标是向下和而纹理中T坐标是向上,所以表达同一个Y坐标和T坐标是相反

    1.5K30

    Android性能优化笔记(一)——启动优化

    例如通过 app 启动生命周期中,关键位置加入时间记录,达到测量目的;又例如可以 Application attachBaseContext方法中记录开始时间,然后启动第一个 Activity...但是需要注意是,懒加载要防止集中化,否则容易出现首页显示后用户无法操作情形。总的来说,用以下四个维度分整理启动各个: 必要且耗时:启动初始化,考虑用线程来初始化。 必要不耗时:首页绘制。...nr_involuntary_switches:被动上下文切换次数,线程被系统强制调度导致上下文切换,例如大量线程抢占 CPU。 第三,避免主线程与子线程之间锁阻塞等待。...Java 对象逃逸也很容易引起 GC 问题,我们写代码时候比较容易忽略这个。我们应该保证对象生命周期尽量短,栈上就进行销毁。...同时也要考虑兼容性问题,暂时不建议 ART 平台使用。 黑科技 保 讲到黑科技,你可能第一个想到就是保。保可以减少 Application 创建跟初始化时间,让冷启动变成温启动。

    94820

    当我们谈注册中心时谈什么?

    服务探 在说服务探前需要介绍一下服务注册维度,维度影响到探。一般来说,服务注册维度有两个:服务维度和应用维度。...,要么就是采取客户端主动上报心跳来告知有哪些服务是存活。...通常客户端主动上报可以很明确知道服务是否存活,但服务端主动探不行,有时候端口,不一定就代表服务是。...多机房支持 其实从上面的描述中已经发现,如果需要支持多机房,CP是更好选择,最好能用路由能力解决多机房就近调用问题,假设有A、B两个机房,X服务只A机房部署,Y服务A、B机房都有部署,如果X调用Y...其次是对注册中心特殊能力需求,如业务高速发展中,需要考虑下性能和水平扩展能力;如想在注册中心上做一些流量控制,可以考虑选型注册中心是否有路由能力;如想快速准确摘除故障机器,那么需要考虑下注册中心服务探能力能否满足需求

    59041

    最新 Android 面试点梳理,我收藏了你呢?

    ,将抽象与具体实现分离,实例:用不同颜色画不同形状 2.外观模式:对外有一个统一接口,外部不用关心内部子系统具体实现,这是"迪米特原则"典型应用 3.适配器模式:改变类接口,使原本由于接口不匹配而无法一起工作两个类能够一工作...基础:Activity、View 绘制、动画、Window、SurfaceView、事件分发 Activity 生命周期 A 打开 B 界面,会先执行 A onPause,再执行 B onCreate...硬件加速原理:将 cpu 一部分工作分担给 gpu ,使用 gpu 完成绘制工作;从工作分摊和绘制机制两个方面优化了绘制速度 Window 、WindowManager、WMS、SurfaceFlinger...、SurfaceTexture、GLSurfaceView SurfaceView:使用双缓冲机制,有自己 surface,一个独立线程里绘制Android7.0之前不能平移、缩放 TextureView...LiveData、ViewModel 可以便捷实现 MVVM 原文链接文章知识点将持续更新及补充,如果你对文中涉及到知识有疑问,欢迎原文链接文章中评论或后台留言哦

    71621

    2020安卓面试心得②:疫情下安逸,九场面试后险获三个offer,这份面试总结值得反思

    25、插件化原理 26、两个用单链表表示大数相加,求他们和。单链表元素值为0~9。...非静态方法A和B同一个类中,方法A用synchronized修饰,当A方法因为多线程请求有线程阻塞在对象锁上时候,B方法访问受不受影响?...三面 1、悬浮窗如何实现 2、通知类别 3、为何需要进程保?如何做? 4、进程优先级 5、Android为何会使用binder来进行进程间通信。 6、oneway和非oneway了解么?...2、flutter生命周期管理?讲讲做过flutter项目。flutter路由管理方式。除了默认两种路由方式,有没有考虑过记录路由状态?...对于Android开发朋友来说应该是最全面最完整面试资料,为了更好地整理每个模块,我参考了很多网上优质博文和项目,力求不漏掉每一个知识

    76400

    OpenGL ES 3.0 | 围绕HelloTriangle实战案例 展开 渲染流程分析

    案例运行(绘制一个三角形)基本步骤 【可以先看看文末代码,结合文章内容去看, 理解了整个流程之后再来看这个步骤,会容易很多】 用EGL创建屏幕上渲染表面(Android直接用一个GLSurfaceView...) 加载顶点、片段着色器 创建一个程序对象, 连接顶点、片段着色器, 并链接程序对象; 设置视口; 清除颜色缓冲区; 渲染简单图元 使颜色缓冲区内容EGL窗口表面(GLSurfaceView)中可见...着色器 OpenGL ES 3.0中, 除非加载有效顶点和片段着色器,否则不会绘制任何几何形状; OpenGL ES 3.0程序必须至少有 一个顶点着色器 和 一个片段着色器; 着色器示例代码:...mHeight ); 通知OpenGL ES 用于绘制2D渲染表面的原点、宽度和高度; OpenGL ES 中, 视口(Viewport) 定义所有 OpenGL ES 渲染操作 最终显示...( 1.0f, 1.0f, 1.0f, 0.0f )了,即白色, 因此屏幕清为白色; 清除颜色设置, 应该由应用程序调用颜色缓冲区GLES30.glClear()之前设置; 加载几何形状和绘制图元

    1.5K10

    OpenGL ES for Android 绘制三角形

    Android绘制三角形顶点shader如下: attribute vec4 vPosition; void main() { gl_Position = vPosition; } vPosition...三角形绘制有3种方式: GL_TRIANGLES:3个顶点绘制一个三角形,即使三角形顶点有重复,也必须在顶点数组中声明。...GL_TRIANGLE_STRIP:前一个三角形两个顶点,和接下来一个顶点组成另外一个三角形,如果有6个顶点,组成三角形顶点有(1,2,3)、(2,3,4)、(3,4,5)、(4,5,6)共4个三角形...,所以有N个顶点,则绘制三角形有N-2个。...GL_TRIANGLE_FAN :以第一个为中心,其它顶点作为边缘绘制出组成扇型相邻三角形,如果有6个顶点,组成三角形顶点有(1,2,3)、(1,3,4)、(1,4,5)、(1,5,6)共4个三角形

    51220

    Android OpenGL ES 渲染模式

    OpenGL ES 基础原理中,我们只是对顶点做了简单填充设置,现在我们继续对片段着色器中颜色做自定义。...这是现有的样式,色值片段着色器中是一个写死值,现在我们需要将它变为动态设置值,将这个两个三角形颜色值设置为红、绿、蓝混合色。也就是三角形三个顶点,分别设置红绿蓝,颜色再从顶点向中间扩散。...加载颜色数据 这一与顶点数据加载方式一样,对于GL程序来说他们只是不同变量,而变量数据填充方式都是一致。明白这一就简单多了,按照顶点数据填充方式来。...我们目前用到渲染方式都是这种,所以我们定义6个顶点,按照这种方式我们就会绘制两个完全不交叉三角形,因为它们顶点并没有交集。...对应我们就能发现,如果绘制相同图形GL_TRIANGLE_STRIP所要加载顶点数会更少,这样OpenGL绘制过程中占用内存也就越低,所以也就更有效。

    51930

    招商银行王龙:金融科技银行数据架构设计13条守则(含PPT)

    本文根据招商银行资深架构师王龙『3306π』北京活动上分享“招行数据库架构探秘”主题整理而成,涉及到数据库架构方面的系统建设原则、MySQL实践等,招商银行在数据库应用上做出了很多探索和创新,非常值得业界学习和借鉴...合理选用同步、异步方式 进行复制时,选择怎样复制方式也非常重要,CAP理论中,C和A选择要依据业务需要,找到适合自己复制方式。 业务系统间;两个数据库间。...1 分库 分库好处是显而易见,通过拆分,可以分担负载,同时提高可用性,即使有某个数据库不可用,也只是损失了 1/n 可用性。 ? 分库常见几个基本问题: 在哪一层实现分库路由? A....web server/app client层实现分库 B....直接路由,适用于交易总是以分区键来进行情况。 B. 查对照表路由。适用于交易凭证有多种情况。 1 云服务能力&DevOps建设 以下是招行在开发和运维等方面的建设实践。

    2K61

    【笔记】《计算机图形学》(15)——曲线

    15.4 Putting Pieces Together 合并片段 15.4.1 Knots 节点 两个不同函数相连称为节点, 最常见节点就是分段函数中两个片段相连...., 节点处只能有C1连续性, n个控制可以生成有(n-2)/2分段....其用n个控制可以生成n-2个片段, 是这三个简单样条曲线中最常用一种....下图是关于这两个共线表达 ? 绘制贝塞尔曲线 前面的参数代数方法自然可以用于插值绘制贝塞尔曲线, 但是实际应用中有一种称为de Casteljau分割方法可以更方便地用于绘制曲线....均匀一次B样条 从简单到复杂来理解B样条, 最简单一次B样条就是两个间隔为2之间进行插值, 所谓均匀是因为这个间隔是均匀分布, 均匀形式B样条不但方便计算还获得了平移不变性.

    2.8K10

    自定义View:手撸一个带FAB凹槽底部导航栏

    (摆烂) emmmmm.....好了成功激起了我好奇心,横竖现下手头上没啥要紧,那就自己手撸一个来玩玩hhhh!...设计思路 既然玩那就干脆玩花一,一步到位给中间按钮加了个简单点击动画,点击后FAB垂直方向上执行一次往返位移,同时底部导航栏上凹槽大小跟随着FAB凹陷深度动态变化,需要实现功能以及思路大体是下面的几个...: 创建好了带导航栏Activity后界面默认是这样子效果: 接下来就是根据需求小细节上修修补补了,由于只需要显示两个导航item,另外需要在导航栏中间给大按钮预留个空位,于是导航栏menu... 到这一步底部导航栏跟页面的基本交互也算完成了 导航栏中间大按钮停靠 之前已经导航栏上留好了放置大按钮位置,接下来就是想办法把这个按钮塞进去,并且设置按钮中心与导航栏顶部居中对齐...只不过这看似挺简单效果,设计路径和计算相关尺寸大小实践起来还是挺麻烦废弃了n种方案之后决定出采用以下一种: 如上图所示,橙色实线为底部导航栏目标形状,canvas绘制原点默认左上角,整个形状直线部分路径比较好确定

    18810

    Android面试题含答案「建议收藏」

    singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开B。...a[min] = a[i]; a[i] = temp; } } } } 冒泡排序 冒泡排序关键是从后向前对相邻两个数组元素进行比较...图片可以以任意中心显示 ImageView, 而不仅仅是图片中心。 PEG 图片改变大小也是 native 进行, 不是虚拟机堆内存, 同样减少 OOM。...所以这两个库相比,Retrofit更有优势,能掌握两个框架前提下该优先使用 Retrofit。...Client发送出最后ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。

    1.4K20

    启动优化

    ) 启动主线程 创建主Activity 扩充视图/加载布局 布局屏幕 执行初始绘制/首帧绘制 应用进程完成第一次绘制,系统进程就会换掉当前显示启动窗口,替换为主 Activity。...nr_involuntary_switches: 被动上下文切换次数,线程被系统强制调度导致上下文切换,例如大量线程抢占CPU。...同时也要考虑兼容性问题,暂时不建议 ART 平台使用 4. 黑科技 保: 保可以减少Application创建跟初始化时间,让冷启动变成温启动。...) 插件化和熱修復: 事实上大部分框架在设计上都存在大量 Hook 和私有 API 调用,带来缺点主要有两个: 稳定性/兼容性: 厂商兼容性、安装失败、dex2oat 失败等,Android P...实验室监控 通过定期自动录屏并分析,也适合做竞品对比测试 如何找到启动结束 80%绘制 图像识别 门槛高,适合大厂 线上监控 启动耗时计算细节: 启动结束统计时机:使用用户真正可以操作时间

    3.5K54

    Android 启动优化详解

    ) 启动主线程 创建主Activity 扩充视图/加载布局 布局屏幕 执行初始绘制/首帧绘制 应用进程完成第一次绘制,系统进程就会换掉当前显示启动窗口,替换为主 Activity。...nr_involuntary_switches: 被动上下文切换次数,线程被系统强制调度导致上下文切换,例如大量线程抢占CPU。...同时也要考虑兼容性问题,暂时不建议 ART 平台使用 4. 黑科技 保: 保可以减少Application创建跟初始化时间,让冷启动变成温启动。...) 插件化和熱修復: 事实上大部分框架在设计上都存在大量 Hook 和私有 API 调用,带来缺点主要有两个: 稳定性/兼容性: 厂商兼容性、安装失败、dex2oat 失败等,Android P...实验室监控 通过定期自动录屏并分析,也适合做竞品对比测试 如何找到启动结束 80%绘制 图像识别 门槛高,适合大厂 线上监控 启动耗时计算细节: 启动结束统计时机:使用用户真正可以操作时间

    5.3K85

    微信团队分享:iOS版微信是如何防止特殊字符导致炸群、APP崩溃

    做法是,排版/绘制字符串前,先设置标记位,排版/绘制结束后,移除标记位。 一旦发现标记位存在,就意味着这字符串可能有问题,下次就不显示这个字符串: ?...5、通用组件MemoryMappedKV 由于需要埋地方太多了,昵称、消息内容、头像等等,为了不影响滑动性能,guoling同学开发了一套基于mmap高性能通用key-value存储组件,敬请留意微信团队公众号后续技术文章...《腾讯技术分享:Android手Q线程死锁监控系统技术实践》 《微信团队原创分享:iOS版微信内存监控系统技术实践》 《让互联网更快:新一代QUIC协议腾讯技术实践分享》 《iOS后台唤醒实战...来龙去脉》 《QQ 18年:解密8亿月QQ后台服务接口隔离技术》 《月8.89亿超级IM微信是如何进行Android端兼容测试》 《以手机QQ为例探讨移动端IM中“轻应用”》 《一篇文章...MMTLS详解》  《微信团队原创分享:Android版微信后台保实战分享(进程保篇)》  《微信团队原创分享:Android版微信后台保实战分享(网络保篇)》  《Android版微信从

    2.8K12
    领券