1. 程式人生 > >網路請求OkHttp,Volley,Retrofit 使用的比較

網路請求OkHttp,Volley,Retrofit 使用的比較

OkHttp的使用

OkHttp現在最新的的版本在github上是3.5.0,它是來自Square公司。有以下幾個優點:
  • 支援 SPDY1 ,允許連線同一主機的所有請求分享一個socket。
  • 如果SPDY不可用,會使用連線池減少請求延遲。
  • 使用GZIP壓縮下載內容,且壓縮操作對使用者是透明的。
  • 利用響應快取來避免重複的網路請求。
接下來看下簡單的使用說明:
  • 在gradle中配置:
compile 'com.squareup.okhttp3:okhttp:3.5.0'
  • 初始化OkHttpClient物件以及Request物件
OkHttpClient mOkHttpClient = new
OkHttpClient(); Request request = new Request.Builder().url(uri).build();
OkHttp支援同步和非同步請求
  • OkHttp同步請求的時候,執行execute()方法,返回一個Response物件,在這裡會阻塞執行緒,直到響應結束,所以是不能在主執行緒中執行。這裡是無返回值的。
Response response = mOkHttpClient.newCall(request).execute();
  • OkHttp非同步請求的時候,執行enqueue()方法,在enqueue()中實現一個Callback介面,因為這個操作是非同步的,所以可以在主執行緒中使用。說的是響應資料是非同步的,但是不能直接再此更新UI元件,因為他是在okhttp執行緒中,直接在此更新UI會報錯。也許你會想到用Message物件將資料傳到主執行緒中,使用Handle來接收並更新UI。而我這裡使用的是Rxjava嵌入內部,被觀察者獲取到資料後傳遞給觀察者,指定觀察者的執行緒是Main主執行緒,就可以很方便的更新資料了。
 mOkHttpClient.newCall(request).enqueue(new Callback() { 
   @Override   
   public void onFailure(Call call, IOException e) {     
       Log.i("lgq","error:"+e);   
     }   
   @Override   
     public void onResponse(Call call, Response response) throws IOException {  
        Log.i("lgq","okhttp response:"
+response); //封裝了觀察者物件程式碼 RequestObserable.responNetRequset(mRecyclerview,response.body().string(),getApplicationContext()); } });
  • 貼出RequestObserable程式碼:
public static void responNetRequset(final RecyclerView mRecyclerview, String result, final Context context) {

        Gson gson = new Gson();
        final NewsInfo newsInfo = gson.fromJson(result, NewsInfo.class);
        Observable.create(new ObservableOnSubscribe<List<Contents>>() {
            @Override
            public void subscribe(ObservableEmitter<List<Contents>> e) throws Exception {
                e.onNext(newsInfo.getResult().getList());
                e.onComplete();
            }
        }).observeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<List<Contents>>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.i("lgq", "onSubscribe");
                    }

                    @Override
                    public void onNext(List<Contents> value) {
                        System.out.println("onNext()----Thread:" + Thread.currentThread().getName());
                        RecycleAdapter mAdapter = new RecycleAdapter(context, value);
                        //介面卡實現監聽事件
                        itemOnClick(mAdapter);
                        mRecyclerview.setLayoutManager(new LinearLayoutManager(context));
                        mRecyclerview.setAdapter(mAdapter);
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.i("lgq", "onError:" + e);
                    }

                    @Override
                    public void onComplete() {
                        Log.i("lgq", "onComplete()");
                    }
                });
    }

1.okhttp-3.5.0.jar包大小342K。

Volley的使用

Volley現在最新的的版本在github上是1.0.19,在2013年Google I/O大會上推出的網路通訊框架。適用於進行資料量不大,但通訊頻繁的網路操作。
簡單的使用例子:
  • 配置gradle
compile 'com.mcxiaoke.volley:library:1.0.19'
  • 在Application中配置全域性單例的RequestQueue物件
 //volley請求佇列
    public static RequestQueue requestQueue;

    public static RequestQueue getRequestQueue(){
        return requestQueue;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        //初始化請求佇列
        requestQueue = Volley.newRequestQueue(getApplicationContext());
    }
  • Volley有StringRequest 請求物件和JsonRequest請求物件,這裡以JsonRequest為例:response即為響應返回獲得的json資料。RequestObserable在上面已經解釋了。
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, uri, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                Log.i("lgq","volley response:"+response);
                RequestObserable.responNetRequset(mRecyclerview,response.toString(),getApplicationContext());
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.i("lgq","volley error:"+error);
            }
        });
        //setting tag for cancel
        jsonObjectRequest.setTag(VO_GET_TAG);
        App.getRequestQueue().add(jsonObjectRequest);
  • ok,無需過多的解釋吧,那繼續。在最後onStop()方法中關閉請求佇列。
 @Override
    protected void onStop() {
        super.onStop();
        //activity關閉的的時候取消請求佇列
        App.getRequestQueue().cancelAll(VO_GET_TAG);
    }

1.library-1.0.19.jar大小為91.6K。

Retrofit的使用

Retrofit現在最新的的版本在github上是2.1.0,也是Square公司的產品,Retrofit在2.0之後的版本和之前的變化很大,做出了優化和簡化,所以直接引入的是2.1.0版本。Retrofit的特點:
  • 它是一個可以用於Android和java的網路庫,使用它可以簡化我們網路操作的工作,提高效率和正確率。
  • gradle引入,這裡還引入了自己的gson庫,可實現將Json資料轉換為java物件。
 //retrofit
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
  • 將rest API封裝為java介面,我們根據業務需求來進行介面的封裝,實際開發可能會封裝多個不同的java介面以滿足業務需求。(註解的形式)
public interface RetrofitService {
    @GET("get")
    Call<NewsInfo> getListDatas(
            @Query("channel")String str,
            @Query("start")String start,
            @Query("num")int num,
            @Query("appkey")String appkey
            );
}
  • 使用Retrofit生成介面例項。
 Retrofit retrofit = new Retrofit.Builder()
                //設定baseUrl,注意baseUrl 應該以/ 結尾。
                .baseUrl("http://api.jisuapi.com/news/")
                //使用Gson解析器,可以替換其他的解析器
                .addConverterFactory(GsonConverterFactory.create())
                .client(new OkHttpClient())
                .build();
        //利用Retrofit 建立服務介面
        RetrofitService retrofitService = retrofit.create(RetrofitService.class);
  • rest風格,更安全和高效。
  • 通過介面例項實現Call方法,而且實現Callback介面是非同步請求,但是onResponse(),onFailure()都是在主執行緒中執行的。可以用來更新UI操作。
 //實現介面引數
        Call<NewsInfo> call = retrofitService.getListDatas("頭條","0",20,BaseActivity.getAPPKEY());

        //執行非同步請求,這裡的onResponse(),onFailure()都是在主執行緒中執行的
        call.enqueue(new Callback<NewsInfo>() {
            @Override
            public void onResponse(Call<NewsInfo> call, Response<NewsInfo> response) {
                if (response.isSuccessful()){
                    RecycleAdapter mAdapter = new RecycleAdapter(getApplicationContext(),response.body().getResult().getList());      //初始化介面卡
                    RequestObserable.itemOnClick(mAdapter);                             //item監聽時間
                    mRecyclerview.setLayoutManager(linearLayoutManager);
                    mRecyclerview.setAdapter(mAdapter);
                }

            }

            @Override
            public void onFailure(Call<NewsInfo> call, Throwable t) {
                Log.i("lgq","onFailure:"+t);
            }
        });
  • 操作上明顯是比volley和okhttp簡單多了。

1.retrofit-2.1.0.jar大小為86.2K。

  1. SPDY(讀作“SPeeDY”)是Google開發的基於TCP的應用層協議,用以最小化網路延遲,提升網路速度,優化使用者的網路使用體驗。SPDY並不是一種用於替代HTTP的協議,而是對HTTP協議的增強。新協議的功能包括資料流的多路複用、請求優先順序以及HTTP報頭壓縮。谷歌表示,引入SPDY協議後,在實驗室測試中頁面載入速度比原先快64%。

相關推薦

網路請求OkHttp,Volley,Retrofit 使用的比較

OkHttp的使用 OkHttp現在最新的的版本在github上是3.5.0,它是來自Square公司。有以下幾個優點: 支援 SPDY1 ,允許連線同一主機的所有請求分享一個socket。 如果SPDY不可用,會使用連線池減少請求延遲。 使用GZIP

Xutils, OKhttp, Volley, Retrofit對比

操作 android開發 明顯 fit ima 是你 xutil 項目 全面 Xutils這個框架非常全面,可以進行網絡請求,可以進行圖片加載處理,可以數據儲存,還可以對view進行註解,使用這個框架非常方便,但是缺點也是非常明顯的,使用這個項目,會導致項目對這個框架依賴

Android網路請求操作Volley框架的使用

1.      Volley框架的優缺點 1)     通訊更快更簡單 2)     Get,Post網路請求及網路影象的高效率非同步處理     請求 3)     排序 4)     網路請求的快取 5)     多級別取消請求 6)     和Activity生命週期

Android肝帝戰紀之網路請求框架封裝(Retrofit的封裝)

網路請求框架封裝(OkHttp3+Retrofit+loading的封裝) Retrofit的Github連結 點此連結到Github AVLoadingIndicatorView的Github連結(封裝到請求框架中,請求過程中的loading樣式框(

Android網路請求開源框架retrofit的基本GET用法(2.4版本)

1.先在gradle配置retrfit版本如下: //rxjava/retrofit相關引入 compile 'io.reactivex.rxjava2:rxandroid:2.0.2' compile 'io.reactivex.rxjava2:rxjav

Android技術選型:你該選擇哪個網路請求開源庫(VolleyOkHttpRetrofit)?

前言 網路請求在 Android 開發中非常常見,為了降低開發週期和難度,我們經常會選用網路請求的開源庫 而現在網路請求的開源庫越來越多,我們應該選用哪種呢? 今天我就給大家分別介紹 & 對比現今主流的網路請求庫。 目錄 1

安卓開發常用網路請求框架OkHttpVolley、XUtils、Retrofit對比

網路請求框架總結1.xutils     此框架龐大而周全,這個框架可以網路請求,同時可以圖片載入,又可以資料儲存,又可以 View 註解,使用這種框架很方便,這樣會使得你整個專案對它依賴性太強,萬一以後這個庫不維護了,或者中間某個模組出問題了,這個影響非常大,所以在專案開發時,一般會更喜歡選擇專注某一領域的

Retrofit+okhttp+Rxjava 網路請求

implementation 'io.reactivex:rxandroid:1.0.1' implementation 'com.squareup.retrofit2:retrofit:2.0.2' implementation 'com.squareup.retrofit2:conver

RxJava+Retrofit+OkHttp深入淺出-終極封裝二(網路請求

CSDN部落格釋出了一系列的RxJava+Retrofit+OkHttp深入淺出-終極封裝 之前發出後收到很多朋友的關注,原本只是自己學習後的一些經驗總結,但是有同學運用到實戰當中,這讓我很惶恐,所有後續一直更新了很多次版本,有些地方難免有所變動導致之前的部落格有所出入,正好最近受到掘金邀請內測部落格,所以決

Retrofit 2.0使用詳解,配合OkHttp、Gson,Android最強網路請求框架

1.使用retrofit,需要下載一些jar包 2.介紹這些jar包的作用 在1.x版本的retrofit框架: 只需要Retrofit包和gson-2.4.jar包就行了,那時的Retrofit預設是使用okhttp jar包來網路請

解決利用Okhttp+Retrofit 傳送網路請求得到json是unicode

我們在用Okhttp和Retrofit傳送網路請求時,得到的json中漢子是unicode編碼,如圖 此時我們需要在Okhttp初始化的時候設定它的網路編輯器,同時將返回值的編碼改成UTF-8. 之前設定的OKhttp HttpLoggingInte

Retrofit + RxJava + OkHttp網路請求變的簡單-封裝篇

前面一篇文章講了一下Retrofit+ RxJava 請求網路的一些基本用法,還沒有看過的可以去看一下Retrofit + RxJava + OkHttp 讓網路請求變的簡單-基礎篇,正如標題所說的,Retrofit+RxJava 是讓我們的網路請求變得簡單,程式碼精簡

Android okHttp網路請求Retrofit+Okhttp+RxJava組合

前言:     通過上面的學習,我們不難發現單純使用okHttp來作為網路庫還是多多少少有那麼一點點不太方便,而且還需自己來管理介面,對於介面的使用的是哪種請求方式也不能一目瞭然,出於這個目的接下來學習一下Retrofit+Okhttp的搭配使用。      okHttp相關文章地址: Retrof

Android網路請求三方庫OkHttp,Retrofit的使用,及其註解使用的簡介

工作內容: 1.OkHttp的Post,Get請求 2.Retrofit的使用【更多詳情可以參考】 學習分享:[程式碼中使用了ButterKnife,參考ButterKnife使用] 1.OkHttp的使用步驟【注意同步載入最好放入子執行緒中:同步載入call.execut

打造屬於自己的網路請求框架(OKHttp+Retrofit+RxJava)

開發者們現在都在使用OkHttp了,在很多借鑑之後,現在也來封裝屬於自己的網路請求框架。 該框架使用Retrofit,OkHttp,RxJava,RxAndroid,Gson一起封裝。 客戶端請求一般分為如下幾步: 通過API向伺服器傳送請求------->伺服器收到

Android常用網路請求框架xUtils、OkHttpVolley、Retorfit對比

網路請求框架總結1.xutils     此框架龐大而周全,這個框架可以網路請求,同時可以圖片載入,又可以資料儲存,又可以 View 註解,使用這種框架很方便,這樣會使得你整個專案對它依賴性太強,萬一以後這個庫不維護了,或者中間某個模組出問題了,這個影響非常大,所以在專案開發時,一般會更喜歡選擇專注某一領域

Android小知識-剖析Retrofit中的網路請求流程以及相關引數

本平臺的文章更新會有延遲,大家可以關注微信公眾號-顧林海,包括年底前會更新kotlin由淺入深系列教程,目前計劃在微信公眾號進行首發,如果大家想獲取最新教程,請關注微信公眾號,謝謝! 在使用Retrofit時,需要建立Retrofit的例項,定義一個網路請求介面併為介面中的方法添加註解,接著通過動

Android小知識-剖析Retrofit網路請求的兩種方式

本平臺的文章更新會有延遲,大家可以關注微信公眾號-顧林海,包括年底前會更新kotlin由淺入深系列教程,目前計劃在微信公眾號進行首發,如果大家想獲取最新教程,請關注微信公眾號,謝謝! 在上一節《Android小知識-剖析Retrofit中ServiceMethod相關引數以及建立過程》介紹了動態代

Retrofit網路請求

本文主要是參考慕課網Jennynick老師視訊所做出的總結。 一、首先明白一點: Retrofit是基於Okhttp網路框架進行的二次封裝,其本質仍是Okhttp。(類似烏爾奇奧拉的二段歸刃) 另外,科普一下,Android5.0之後不再使用HttpClient了。本來還想著看看http

Android RxJava操作符的學習---功能性操作符--網路請求出錯重連(結合Retrofit

1. 需求場景   2. 功能說明 功能需求說明     功能邏輯  例項說明 在本例子中:採用Get方法對 金山詞霸API 傳送網路請求 通過 斷開網路連線 模擬 網路異常錯誤(恢復網路即可