Mapbox源码分析(2)url解析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mapbox源码分析(2)url解析相关的知识,希望对你有一定的参考价值。

参考技术A 通过源码,我们来一步步分析Mapbox地图引擎如何进行指定字符串变量解析成url地址加载的,这里是基于5.3.0的版本.

在官方demo中,我们不仅可以加载本地样式文件,已定义样式文件和网络在线文件,它们的格式分别是

1. "asset://test.json"

2 . "https://www.mapbox.com/android-docs/files/mapbox-raster-v8.json"

3 . "mapbox://styles/mapbox/streets-v10"

这些格式,那么Mapbox如果解析这些字符串去获取到需要的样式数据呢?我们从 Mapbox源码分析(1)样式加载 这篇的loadURL()方法开始看起

我们在这里看到,样式的数据是通过fileSource.request进行请求加载的,通过调试我们发现这个fileSource是FileSource的子类DefaultFileSource,那么我们先看看这个DefaultFileSource是什么时候传进来的

我们在这里看到,是在构造方法时对fileSource变量进行初始化的,那么我们只需要看到Style::Impl对象什么时候构造的,便知道了fileSource的来源,继续往回找

在这里我们发现Impl对象的fileSource是Style对象构造时传进来的,那么我们继续往回找

这里我们看到Style对象是通过map.cpp里的getStyle对象获取的,而style对象是在Map::Impl::Impl构造方法时初始化的,继续往回找

这里我们其实也能大概猜出来Map::Impl对象是在Map构造方法时初始化的,那么map对象又是什么时候初始化的,是不是觉得很绕,马上就快到了,我们找到native_map_view.cpp文件,发现在NativeMapView构造方法中构造了map对象

到这里我们已经基本清楚fileSource的来源了,是JAVA层NativeMapView对象初始化的时候传下来的,我们继续看到开头,既然我们已经知道fileSource对象是DefaultFileSource,那么它调用的request方法,也就是调用的DefaultFileSource的request方法,这里我们看到default_file_source.cpp文件

这里我们看到它转到了它的实现类的request方法

这里我们可以看到根据url的不同,和加载方法的不同,将请求分别转给了assetFileSource,localFileSource,onlineFileSource等的request方法,这里我们看onlineFileSource的request方法

看到这里我们看到根据请求的类型不同,去处理不同的url,在这些参数里我们看下apiBaseURL这个变量,这是一个base url,指定了服务器地址,我们在constants.hpp文件中找到了它

constexpr const char* API_BASE_URL = "https://api.mapbox.com";

继续往下看,我们选normalizeStyleURL()方法往下看

这里我们看到它先验证了一下url,然后将url字符串包装成URL对象,然后进行一个拼接成tpl变量,最后再通过transformURL函数进行一个转换,这里我们先看它如何包装这个URL对象的

这里我们看到它将字符串分解成query,scheme,domain,path四个变量进行存储,我们再看看transformURL()函数

这里我们看到根据url的不同变量值进行了再次字符串拼接,甚至根据路径的不同,继续拆分成Path对象,最后将拼接结果返回,到这里有关url解析拼接的过程就讲完了.

okHttp源码解析------待续

 

看该篇文章前首先要熟悉okHttp的使用,建议先读OkHttp的简单使用

本文的源码解析参考链接:okhttp3总和解析

1.从URL请求处理开始分析

由异步将请求加入调度方法开始引入正题:

getClient().newCall(request).enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                    }
});
/**
   * Prepares the {@code request} to be executed at some point in the future.
   */
  @Override public Call newCall(Request request) {
    return new RealCall(this, request);
  }
@Override public void enqueue(Callback responseCallback) {
    enqueue(responseCallback, false);
  }

  void enqueue(Callback responseCallback, boolean forWebSocket) {
    synchronized (this) {
      if (executed) throw new IllegalStateException("Already Executed");
      executed = true;
    }
    client.dispatcher().enqueue(new AsyncCall(responseCallback, forWebSocket));
  }

由源码上的调用顺序,我们将步骤转化为以下的几个技术点:

 

由以上的使用okhttp请求的调用代码,可以看到最终的请求时通过dispatcher来完成的。

2.Dispatcher调度者

Dispatcher进行线程分发,有两个方法,一个是普通的单线程,也就是线程阻塞的方式请求;另一种就是通过队列进行并发任务的分发和回调,下面主要分析第二种:

 就是想到生成一个可缓存的线程池,实现高并发、低阻塞的任务调度。

 

3.Interceptor拦截器

拦截器主要用来观察、修改、以及可能短路的清除输出、和响应的回来。

通常用来添加、移除或者转换请求或者xiangying的头部信息。比如将域名替换为ip地址,将请求头中添加host属性,也可以添加我们应用中的一些公共参数,比如设备id、版本号等等。

http://www.jianshu.com/p/2710ed1e6b48 

 

4.缓存策略

 

4.Socket管理(StreamAllocation)

 

5.HTTP请求序列化/反序列化

 

6计算机常识

 

以上是关于Mapbox源码分析(2)url解析的主要内容,如果未能解决你的问题,请参考以下文章

SnapHelper源码深度解析

SnapHelper源码深度解析

Dubbo 源码分析 - 服务导出全过程解析

Spring MVC源码分析--视图解析过程

SpringBoot2各类型参数解析原理(源码分析)

Volley框架源码分析