Android發(fā)展到目前柬帕,網(wǎng)絡(luò)框架推陳出新呵扛,目前主要有四大成熟的框架,本文簡要分析各大框架的實現(xiàn)原理痢士。具體的用法可參考文中給出的鏈接。
Android主流框架
Retrofit
Okhttp
Volley
AsyncHttpClient
Retrofit
特點
- 動態(tài)代理
- 適配轉(zhuǎn)換Call對象
- 函數(shù)解析茂装、網(wǎng)絡(luò)請求和數(shù)據(jù)轉(zhuǎn)換
接口
public interface ApiService{
// 與Rxjava結(jié)合使用
@POST(NetUrl.HOME_URL)
public Obserable<HttpResult<HomeResponse>> getHomeList(@BODY BodyRequest body);
@GET(NetUrl.VERSION_URL)
public Obserable<HttpResult<VersionResponse>> getVersionDetail();
// 沒有添加Call回調(diào)處理怠蹂,直接返回Okhttp的Call
@Get(NetUrl.USER_URL)
public Call<HttpResult<UserResponse>> getUser(@Query("uid") long uid)
}
原理
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Config.BASE_URL) // baseUrl 以/結(jié)尾
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 添加Call回調(diào)
.addConverterFactory(GsonConverterFactory.create()) // 解析器
.client(okHttpClient) //配置okHttpClient
.build();
ApiService service = retrofit.create(ApiService.class);
// 在業(yè)務(wù)層調(diào)用ApiService的方法
service.getVersionDetail();
1.Retrofit通過動態(tài)代理,retrofit.create(ApiService.class)
將接口與Okhttp綁定
public <T> T create(final Class<T> service) {
...
return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
new InvocationHandler() {
...
ServiceMethod<Object, Object> serviceMethod =
(ServiceMethod<Object, Object>) loadServiceMethod(method);
OkHttpCall<Object> okHttpCall = new OkHttpCall<>(serviceMethod, args);
return serviceMethod.callAdapter.adapt(okHttpCall);
}
});
}
2.內(nèi)部維護Okhttp少态,網(wǎng)絡(luò)請求由Okhttp完成城侧,Retrofit只負(fù)責(zé)生產(chǎn)工作
3.Call回調(diào), 實際上就是Okhttp的Call回調(diào),對應(yīng)配置.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
彼妻,若沒有此配置嫌佑,將返回Call<Bean>
對象
4.Call回調(diào)方法中的數(shù)據(jù)解析,對應(yīng)配置.addConverterFactory(GsonConverterFactory.create())
, 也可以是Jsonfast
的解析轉(zhuǎn)換工廠或自定以的解析工廠侨歉,只需實現(xiàn)Retrofit
給出的數(shù)據(jù)解析接口屋摇,可參考GsonConverterFactory
的實現(xiàn)
Okhttp
原理
OkHttp的底層是通過Java的Socket發(fā)送HTTP或HTTPS請求與接受響應(yīng),但是OkHttp實現(xiàn)了連接池的概念幽邓,即對于同一主機的多個請求炮温,其實可以公用一個Socket連接,而不是每次發(fā)送完HTTP請求就關(guān)閉底層的Socket牵舵,這樣就實現(xiàn)了連接池的概念柒啤。而OkHttp對Socket的讀寫操作使用的OkIo庫進行了一層封裝。
OkHttp的主角們
OkHttpClient
Factory for calls, which can be used to send HTTP requests and read their responses.
工廠生產(chǎn)者畸颅,負(fù)責(zé)生產(chǎn)calls
Request
OkHttp的請求担巩,通過Request.Builder().build
創(chuàng)建, Request.Builder()
配置請求信息,如請求方式get/post
等没炒、請求參數(shù)RequestBody
兵睛、請求頭header
Call
調(diào)度者,Call作頂級接口窥浪,具體實現(xiàn)由RealCall負(fù)責(zé)祖很。負(fù)責(zé)Request
和Response
的橋梁作用,將Request
以execute()
同步的方式執(zhí)行輸出Response
, 或?qū)?code>Request以enqueue(callback)
異步的方式加入調(diào)度漾脂。
Dispatcher(ThreadPoolExecutor)
調(diào)度線程池Disptcher實現(xiàn)了高并發(fā)假颇,低阻塞的實現(xiàn)。采用Deque作為緩存骨稿,先進先出的順序執(zhí)行
任務(wù)在try/finally中調(diào)用了finished函數(shù)笨鸡,控制任務(wù)隊列的執(zhí)行順序,而不是采用鎖坦冠,減少了編碼復(fù)雜性提高性能
只有當(dāng)Call以異步請求的方式形耗,才觸發(fā)Dispatcher的調(diào)度工作。
Response
響應(yīng)辙浑,包括code激涤、message、header判呕、body等信息
// 1.創(chuàng)建Client
OkHttpClient client = new OkHttpClient.Builder().build()
// 2.創(chuàng)建Request
Request reuqest = new Request.Builder().get().url(url).builder()
// 3.call execute同步
Response response = client.newCall(request).execute()
// 異步倦踢,回調(diào)在子線程中執(zhí)行
client.newCall(request).enqueue(new Callback{
@Override
public void onFailure(Call call, IOException e){
}
@Override
public void onResponse(Call call, Response response){
}
})
Volley
RequestQueue
- StringRequest
- JsonRequest
- ImageRequest
Diapatch Thread
- MainDispatcher
- CacheDispatcher
- NetworkDispatcher
- ImageDispatcher
Get Data Interface
HttpStack
處理 Http 請求,返回請求結(jié)果侠草。目前 Volley 中有基于 HttpURLConnection 的HurlStack和 基于 Apache HttpClient 的HttpClientStackResponseDelivery(返回結(jié)果分發(fā)接口辱挥,目前只有基于ExecutorDelivery的在入?yún)?handler 對應(yīng)線程內(nèi)進行分發(fā)。)
Data
- Cache(Volley 默認(rèn)使用的是基于 sdcard 的DiskBasedCache)
- Network(NetworkResponse)
總結(jié)
通過兩種Dispatch Thread不斷從RequestQueue中取出請求边涕,根據(jù)是否已緩存調(diào)用Cache或Network這兩類數(shù)據(jù)獲取接口之一晤碘,從內(nèi)存緩存或是服務(wù)器取得請求的數(shù)據(jù),然后交由ResponseDelivery去做結(jié)果分發(fā)及回調(diào)處理功蜓。
AysncHttpClient
Apache HttpClient 異步請求园爷,利用線程池來管理請求線程,這里不做主要分析了霞赫。腮介。。