Retrofit2.0詳解(一簡單使用)
阿新 • • 發佈:2019-01-04
幾個月前,對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介面
將http api轉換為java介面,指定請求方式,和確定返回值型別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); }
建立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的優點我就不多說了,也就鏈式呼叫,使的程式碼邏輯更加清晰,增加程式碼的可讀性,另外通過一系列的操作符完成對發出的訊息進行一系列變化操作