1. 程式人生 > >Retrofit2.0詳解(一簡單使用)

Retrofit2.0詳解(一簡單使用)

幾個月前,對Retrofit進行了一個系統的學習,不過沒有做一個整理和總結,正好國慶沒什麼事就寫幾篇部落格對Retrofit的簡單使用,上傳下載進度監聽,封裝使用,原始碼解析做一個學習,記錄如下

1~簡單使用

      由於retrofit2.0與先前版本的差別還是比較大,對於不同版本之間的差異在這裡就不在進行詳細區別。下面的例子也是針對於retrofit2.0進行介紹的。retrofit2.0它依賴於OkHttp,而且這部分也不再支援替換。在這裡我們也不需要顯示的匯入okHttp,在retrofit中已經匯入okhttp3。

新增依賴

      compile 'com.squareup.retrofit2:retrofit:2.1.0'
      compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2' 

建立Api介面
public interface ApiService {
         //GET為GET請求,標明請求地址為BASEURI+/users/{user}
         //{user}會被getFeed方法的引數代替
         //JsonBean為自己設定返回型別,通過.addConverterFactory(GsonConverterFactory.create())
         //利用gson自動完成資料轉換
         @GET("users/{user}")
         Call<JsonBean> getFeed(@Path("user")String user);
       }
將http api轉換為java介面,指定請求方式,和確定返回值型別

建立Retrofit例項

Retrofit retrofit=new Retrofit.Builder()
                        .baseUrl("https://api.github.com/")// '/'儘量放在baseUri的後面而不是放在註解中url的前面
                         //新增轉換器完成資料轉換,將Json型別的資料轉換為JavaBean
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();

呼叫Api介面

在呼叫API介面請求後,獲得一個json字串,通過Gson進行解析成一個JsonBean

               //得到ApiService
                ApiService service=retrofit.create(ApiService.class);
                Call<JsonBean> call = service.getFeed("Guolei1130");
                call.enqueue(new Callback<JsonBean>() {
                    @Override
                    public void onResponse(Response<JsonBean> response, Retrofit retrofit) {
                        JsonBean jsonBean=response.body(); 
                        Log.e(TAG, "onResponse: "+jsonBean.toString());
                    }

                    @Override
                    public void onFailure(Throwable t) {
                        Log.e(TAG, "onFailure: "+t.getMessage());
                    }
                });

2~Retrofit註解詳解

請求方式

GET,POST,HEAD,PUT等等,其實常用的就GET和POST

路徑拼接

  ①Path

Call<JsonBean> getFeed(@Path("user")String user);    

  ②Query-一個鍵值對

Call<JsonBean> onekey(@Query("wd") String wdvalue);   

  ③QueryMap-多個鍵值對
Call<JsonBean> manykey(@QueryMap  Map<string, string> options);

 對於下面這張拼接
Call<JsonBean> test(@Path("user")String user,@Query("name")String name,@QueryMap Map<String,String> options);

     HashMap<String,String> map=new HashMap<String,String>();
            map.put("age",1);
            map.put("password","123");      
            Call<JsonBean> feed = service.getFeed("xx","liujian",map);

最終拼接成的url為BaseUri+"group/xx?name=liujian&&age=1&&password=123"

 ④請求體

我們知道post和get的區別當中有一點就是引數的位置,get放在url路徑當中,post放在請求體當中。   
注意:請求體物件會轉換成json格式資料提交,伺服器端需要進行json解析

@POST("users/new.jsp")
Call<User> createUser(@Body User user);

⑤表單FormUrlEncoded

使用表單格式進行post提交,每個鍵值對都要被含有名字的@Field註解和提供值的物件所標註

@FormUrlEncoded
@POST("/index.php")
Call<User> updateUser(@Field("first_name") @Body User user, @Field("last_name") String last);

我們還可以使用下面的簡單方式

//@FieldMap註解和Map物件引數來指定每個表單項的Key,value的值:
@FormUrlEncoded
@POST("user/index.php")
Call<User> updateUser(@FieldMap Map<String,String> fieldMap);

⑥表單Multipart

通過@Multipart註解來發送Multipart資料。通過@Part註解來定義需要傳送的檔案。

@Multipart
@POST("/fileabout.php")
Call<String> upload(@Part("fileName") String des,
                          @Part("file\"; filename=\"1.txt") RequestBody file);

⑧Header處理

以使用@Headers註解給函式設定靜態的header

@Headers("Cache-Control: max-age=640000")
@Headers({
              "Accept: application/vnd.github.v3.full+json",
              "User-Agent: Retrofit-Sample-App"
           })

⑨Url

Retrofit2.0中提出一個新的註解@Url,允許我們直接傳入請求的URL

       @GET
       Call<List<Contributor>> repoContributorsPaginate(@Url String url);

3~同步和取消任務

同步

Response<JsonBean> response=call.excute()
JsonBean jsonBean=response.body();   

取消正在執行的任務

call.cancel()

4~Retrofit與RxJava

    <span style="font-size:14px;">@GET("users/{user}") 
     Observable<JsonBean> getFeed(@Path("user")String user);
     
     Retrofit retrofit = new Retrofit.Builder()
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
        .addConverterFactory(GsonConverterFactory.create())
        .baseUrl("https://api.github.com/")
        .build();
     
     
     ApiService service=retrofit.create(ApiService.class);
     service.getFeed("Guolei1130")
     .observeOn(AndroidSchedulers.mainThread())//讓訂閱的操作傳送在主執行緒中
     .subscribe(new Observer<JsonBean>() {
        @Override
        public void onNext(JsonBean user) {
            userView.setUser(user);
        }
        
        @Override
        public void onCompleted() {
        }

        @Override
        public void onError(Throwable error) {
            // Error handling
            ...
        }
    });  </span>

對於RxJava不熟悉的可以去看一下我前面的部落格,RxJava的優點我就不多說了,也就鏈式呼叫,使的程式碼邏輯更加清晰,增加程式碼的可讀性,另外通過一系列的操作符完成對發出的訊息進行一系列變化操作