摘要:因為使用默認將返回的對象對象轉換成了的對象了使用但是我們在使用后,有時可能會這樣聲明接口這樣定義可以很方便的在返回中直接一個對象了登錄成功登錄失敗但是這樣有一個問題就是會丟失的元數據,因為對象我們是沒法訪問的。
Retrofit:聲明 ApiService接口
我們在使用Retrofit的時候只需要把URL通過注解的形式寫到APIService文件中就行了。
比如登錄功能:
如果后臺的成功返回格式為
{ code:0; Message:"login success" }
失敗的返回格式為
{ code:-1; Message:"login failed" }
我們定義個一個Bean類LoginResult.
public class LoginResult{ private int code; private String message; //get/set }不使用Rxjava
在方法的定義中,如果不適用Rxjava的話,
@Post @FormUrlEncoded Calllogin(@Field("userName") String userName, @Field("password")String password);
在使用的時候們只需要使用apiService.login("dsf", "dsf"),就好了。該方法會返回一個Call
我們只需要或者異步執行
//同步執行 Responseresponse = call.execute(); //異步調用 call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { } });
然后我們在返回結果里面操作就行了,如果我們需要Response里面的元數據,比如header里面的信息的話,直接從Response取就好了。
因為Retrofit 使用DefaultCallAdapterFactory默認將OKHttp返回的Call對象(OkHttp對象)轉換成了Retrofit的Call
但是我們在使用RxJava后,有時可能會這樣聲明接口
@Post @FormUrlEncoded Observablelogin(@Field("userName") String userName, @Field("password")String password);
這樣定義可以很方便的在返回中直接subScribe一個Action對象了
Observableobservable = model.login("dfs", "dfs"); observable.subscribe(new Action1 () { @Override public void call(LoginResult loginResult) { if (loginResult.getCode() == 0) { //登錄成功 } else { //登錄失敗 } } });
但是這樣有一個問題就是會丟失Response的元數據,因為Response對象我們是沒法訪問的。因為Retrofit已經幫助我們做了轉換,直接把我們接口方法里定義的數據類型轉換好后返回給我們了。去掉了Response信息。
Observable我們可以這么定義接口
@Post @FormUrlEncoded Observable> login(@Field("userName") String userName, @Field("password")String password);
這樣我們就得到這樣的返回結果。
Observable> observable = model.login("dfs", "dfs"); observable.subscribe(new Action1 >() { @Override public void call(Response loginResultResponse) { if (loginResultResponse.code() == 200){ LoginResult body = loginResultResponse.body(); }else { //登錄失敗 } } });
這樣就能拿到Response信息了,然后根據Response code判斷是否登錄成功了。
但是這樣有個問題是我們寫接口會特備繁瑣,每次都得使用Response<>泛型。一般我們都寫作Observable
其實我們一般情況下也不關注Response信息的。但是不排除特殊情況
比如這種情況
https://academy.realm.io/cn/p...
這篇文章提到的分頁加載的情況,其實這種情況也可以將下一個頁面的URL放到Response body里返回。
這里只是給出了一種情景。
現實中解決方案很多種,只能折中了,其實我們沒必要使用Response的Response code 來判斷接口是否調用成功了。因為Retrofit都幫我們做過了。所以我們定義接口的時候只要使用Observable
我們在使用Retrofit + Rxjava 的時候一般都這么生成Retrofit client的
Retrofit retrofit = new Retrofit.Builder() .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .baseUrl(baseUrl) .build();
這里RxJavaCallAdapterFactory生成的CallAdapter對象就幫我們做好了結果的轉換
我們看一下RxJavaCallAdapterFactory的聲明。
/** * A {@linkplain CallAdapter.Factory call adapter} which uses RxJava for creating observables. ** Adding this class to {@link Retrofit} allows you to return {@link Observable} from service * methods. *
* There are three configurations supported for the {@code Observable} type parameter: 有三種配置支持Observable的類型參數 ** interface MyService { * @GET("user/me") * Observable
getUser() * } *
結論就是,如果我們沒有對Response有特殊的需求的話,直接在接口聲明處直接聲明成Observable
這篇文章本應該和Retofit源碼分析一起寫的,奈何Retrofit的源碼實在是太晦澀難懂了
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75933.html
摘要:看下圖所示,摘自網絡的創建流程源碼分析實例是使用建造者模式通過類進行創建的。創建了一個含有對象實例的,并返回給源碼分析添加一個調用適配器工廠,用于支持服務方法返回類型注意生產的是,那么又是什么呢可以看到源代碼如下所示,它是一個接口。 目錄介紹 1.首先回顧Retrofit簡單使用方法 2.Retrofit的創建流程源碼分析 2.1 Retrofit對象調用Builder()源碼解...
閱讀 3089·2021-09-24 10:26
閱讀 3257·2021-09-23 11:54
閱讀 4677·2021-09-22 15:33
閱讀 2249·2021-09-09 09:33
閱讀 1650·2021-09-07 10:10
閱讀 957·2019-08-30 11:09
閱讀 2846·2019-08-29 17:13
閱讀 1002·2019-08-29 12:35