1. 程式人生 > >Retrofit+Okhttp+RxJava介紹的簡單太簡單,但很容易理解

Retrofit+Okhttp+RxJava介紹的簡單太簡單,但很容易理解

轉載的 https://www.cnblogs.com/whoislcj/p/5539239.html

 

 

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

前言:

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

     okHttp相關文章地址:

Retrofit介紹:

  Retrofit和okHttp師出同門,也是Square的開源庫,它是一個型別安全的網路請求庫,Retrofit簡化了網路請求流程,基於OkHtttp做了封裝,解耦的更徹底:比方說通過註解來配置請求引數,通過工廠來生成CallAdapter,Converter,你可以使用不同的請求介面卡(CallAdapter), 比方說RxJava,Java8, Guava。你可以使用不同的反序列化工具(Converter),比方說json, protobuff, xml, moshi等等。

  • 官網 http://square.github.io/retrofit/
  • github https://github.com/square/retrofit

Retrofit+OkHttpClient使用:

1.)在build.gradle中新增如下配置

compile 'com.squareup.retrofit2:retrofit:2.1.0'

2.)初始化Retrofit

     retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(FastJsonConverterFactory.create())
                .client(mOkHttpClient)
                .build();

3.)初始化OkHttpClient

複製程式碼

        OkHttpClient.Builder builder = new OkHttpClient().newBuilder()
                .connectTimeout(10, TimeUnit.SECONDS)//設定超時時間
                .readTimeout(10, TimeUnit.SECONDS)//設定讀取超時時間
                .writeTimeout(10, TimeUnit.SECONDS);//設定寫入超時時間
        int cacheSize = 10 * 1024 * 1024; // 10 MiB
        Cache cache = new Cache(App.getContext().getCacheDir(), cacheSize);
        builder.cache(cache);
        builder.addInterceptor(interceptor);
        mOkHttpClient = builder.build();

複製程式碼

關於okHttp的攔截器、Cache-Control等這裡就不再做解說了

4.)關於ConverterFactory

對於okHttpClient的初始化我們都已經很熟悉了,對ConverterFactory初次接觸多少有點陌生,其實這個就是用來統一解析ResponseBody返回資料的。

常見的ConverterFactory

  • Gsoncom.squareup.retrofit2:converter-gson
  • Jacksoncom.squareup.retrofit2:converter-jackson
  • Moshicom.squareup.retrofit2:converter-moshi
  • Protobufcom.squareup.retrofit2:converter-protobuf
  • Wirecom.squareup.retrofit2:converter-wire
  • Simple XMLcom.squareup.retrofit2:converter-simplexml
  • Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars

    由於專案中使用的是FastJson,所以只能自己自定義ConverterFactory,不過國內已經有大神對此作了封裝(http://www.tuicool.com/articles/j6rmyi7)。

  • FastJson compile 'org.ligboy.retrofit2:converter-fastjson-android:2.0.2'

 

5.)定義介面 get 請求

     1.get請求 不帶任何引數

public interface IApi {

    @GET("users")//不帶引數get請求
    Call<List<User>> getUsers();

}

   2.get請求 動態路徑 @Path使用

public interface IApi {

   @GET("users/{groupId}")//動態路徑get請求
   Call<List<User>> getUsers(@Path("userId") String userId);

}

  3.get請求 拼接引數 @Query使用

public interface IApi {

    @GET("users/{groupId}")
    Call<List<User>> getUsers(@Path("userId") String userId, @Query("age")int age);

}

  3.get請求 拼接引數 @QueryMap使用

public interface IApi {

    @GET("users/{groupId}")
    Call<List<User>> getUsers(@Path("userId") String userId, @QueryMap HashMap<String, String> paramsMap);

}

6.)定義介面 post請求

   1.post請求 @body使用

public interface IApi {

    @POST("add")//直接把物件通過ConverterFactory轉化成對應的引數
    Call<List<User>> addUser(@Body User user);

}

   2.post請求 @FormUrlEncoded,@Field使用

複製程式碼

public interface IApi {

 @POST("login")
    @FormUrlEncoded//讀引數進行urlEncoded
    Call<User> login(@Field("userId") String username, @Field("password") String password);

}

複製程式碼

  3.post請求 @FormUrlEncoded,@FieldMap使用

複製程式碼

public interface IApi {

    @POST("login")
    @FormUrlEncoded//讀引數進行urlEncoded
    Call<User> login(@FieldMap  HashMap<String, String> paramsMap);

}

複製程式碼

  4.post請求 @Multipart,@Part使用

複製程式碼

public interface IApi {

    @Multipart
    @POST("login")
    Call<User> login(@Part("userId") String userId, @Part("password") String password);

}

複製程式碼

7.)Cache-Control快取控制

複製程式碼

public interface IApi {

    @Headers("Cache-Control: max-age=640000")
    @GET("users")//不帶引數get請求
    Call<List<User>> getUsers();

}

複製程式碼

8.)請求使用

  1.返回IApi 

複製程式碼

    /**
     * 初始化Api
     */
    private void initIApi() {
        iApi = retrofit.create(IApi.class);
    }

    /**
     * 返回Api
     */
    public static IApi api() {

        return api.iApi;
    }

複製程式碼

  2.傳送請求

複製程式碼

    Call<String> call = Api.api().login(userId,password);
    call.enqueue(new Callback<String>() {
    @Override
    public void onResponse(Call<String> call, Response<String> response) {
        Log.e("", "response---->" + response.body());
    }

    @Override
    public void onFailure(Call<String> call, Throwable t) {
        Log.e("", "response----失敗");
    }
    });

複製程式碼

Retrofit+RxJava使用:

  上面介紹了Retrofit 與OkHttp的結合,下面介紹一下Retrofit與RxJava的結合,RxJava作為當前的開源庫的網紅之一,Retrofit理所當然也提供了對其的支援,RxJava的強大之處強大的非同步處理能力,Retrofit與RxJava的結合勢必提高開發效率以及執行效能。

1.)在原來的基礎上新增以下依賴

 compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1' // Retrofit的rx解析庫
 compile 'io.reactivex:rxandroid:1.2.0'
 compile 'io.reactivex:rxjava:1.1.5'

2.)建立retrofit物件例項時,通過addCallAdapterFactory來新增對RxJava的支援

複製程式碼

  /**
     * 初始化Retrofit
     */
    private void initRetrofit() {
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(FastJsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .client(mOkHttpClient)
                .build();
    }

複製程式碼

3.)定義請求介面

public interface IApi {

    @POST("system/login")
    Observable<String> systemLogin(@Body String userId, @Body String password);

}

4.)呼叫傳送請求

複製程式碼

Api.api().systemLogin(userId,password)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Subscriber<String>() {
        @Override
        public void onCompleted() {
        }

        @Override
        public void onError(Throwable e) {
        }

        @Override
        public void onNext(String result) {

        }
    });

複製程式碼

總結:

  這裡簡單介紹了Retrofit與Okhttp、RxJava的結合使用。

 

幹我們這行,啥時候懈怠,就意味著長進的停止,長進的停止就意味著被淘汰,只能往前衝,直到鳳凰涅槃的一天!