Android主流網(wǎng)絡(luò)框架

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)
}

原理

image
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庫進行了一層封裝。

image

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é)RequestResponse的橋梁作用,將Requestexecute()同步的方式執(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

image

RequestQueue

  • StringRequest
  • JsonRequest
  • ImageRequest

Diapatch Thread

  • MainDispatcher
  • CacheDispatcher
  • NetworkDispatcher
  • ImageDispatcher

Get Data Interface

  • HttpStack
    處理 Http 請求,返回請求結(jié)果侠草。目前 Volley 中有基于 HttpURLConnection 的HurlStack和 基于 Apache HttpClient 的HttpClientStack

  • ResponseDelivery(返回結(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 異步請求园爷,利用線程池來管理請求線程,這里不做主要分析了霞赫。腮介。。

框架資料/官方文檔參考

Retrofit

Okhttp

Volley源碼 Volley分析

AsyncHttpClient

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末端衰,一起剝皮案震驚了整個濱河市叠洗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旅东,老刑警劉巖灭抑,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異抵代,居然都是意外死亡腾节,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來案腺,“玉大人庆冕,你說我怎么就攤上這事∨ィ” “怎么了访递?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長同辣。 經(jīng)常有香客問我拷姿,道長,這世上最難降的妖魔是什么旱函? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任响巢,我火速辦了婚禮,結(jié)果婚禮上棒妨,老公的妹妹穿的比我還像新娘踪古。我一直安慰自己,他們只是感情好靶衍,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布灾炭。 她就那樣靜靜地躺著,像睡著了一般颅眶。 火紅的嫁衣襯著肌膚如雪蜈出。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天涛酗,我揣著相機與錄音铡原,去河邊找鬼。 笑死商叹,一個胖子當(dāng)著我的面吹牛燕刻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播剖笙,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼卵洗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了弥咪?” 一聲冷哼從身側(cè)響起过蹂,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎聚至,沒想到半個月后酷勺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡扳躬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年脆诉,在試婚紗的時候發(fā)現(xiàn)自己被綠了甚亭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡击胜,死狀恐怖亏狰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情潜的,我是刑警寧澤骚揍,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站啰挪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嘲叔。R本人自食惡果不足惜亡呵,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望硫戈。 院中可真熱鬧锰什,春花似錦、人聲如沸丁逝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽霜幼。三九已至嫩码,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間罪既,已是汗流浹背铸题。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留琢感,地道東北人丢间。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像驹针,于是被迫代替她去往敵國和親烘挫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容