簡介:
通過源碼无拗,我們來一步步分析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進行請求加載的,通過調試我們發(fā)現這個fileSource是FileSource的子類DefaultFileSource猫缭,那么我們先看看這個DefaultFileSource是什么時候傳進來的
我們在這里看到葱弟,是在構造方法時對fileSource變量進行初始化的,那么我們只需要看到Style::Impl對象什么時候構造的猜丹,便知道了fileSource的來源芝加,繼續(xù)往回找
在這里我們發(fā)現Impl對象的fileSource是Style對象構造時傳進來的,那么我們繼續(xù)往回找
這里我們看到Style對象是通過map.cpp里的getStyle對象獲取的射窒,而style對象是在Map::Impl::Impl構造方法時初始化的妖混,繼續(xù)往回找
這里我們其實也能大概猜出來Map::Impl對象是在Map構造方法時初始化的,那么map對象又是什么時候初始化的轮洋,是不是覺得很繞制市,馬上就快到了,我們找到native_map_view.cpp文件弊予,發(fā)現在NativeMapView構造方法中構造了map對象
到這里我們已經基本清楚fileSource的來源了祥楣,是JAVA層NativeMapView對象初始化的時候傳下來的,我們繼續(xù)看到開頭汉柒,既然我們已經知道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";
繼續(xù)往下看,我們選normalizeStyleURL()方法往下看
這里我們看到它先驗證了一下url,然后將url字符串包裝成URL對象讼育,然后進行一個拼接成tpl變量帐姻,最后再通過transformURL函數進行一個轉換,這里我們先看它如何包裝這個URL對象的
這里我們看到它將字符串分解成query,scheme,domain,path四個變量進行存儲奶段,我們再看看transformURL()函數
這里我們看到根據url的不同變量值進行了再次字符串拼接饥瓷,甚至根據路徑的不同,繼續(xù)拆分成Path對象痹籍,最后將拼接結果返回扛伍,到這里有關url解析拼接的過程就講完了.