您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Android RxJava與Retrofit怎么結(jié)合使用”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'io.reactivex.rxjava2:rxjava:2.x.y'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
添加依賴本并不想多說,我想大家都知道,但是對于剛接觸這些知識的時候我想有沒有人在看網(wǎng)上的文章時會覺得有些依賴是在哪找到并添加的呢?例如:com.squareup.retrofit2:converter-gson:2.3.0
我們要添加一個GsonConverter
的依賴。對于剛接觸這些知識和不經(jīng)常逛GitHub的人來說會不會一臉懵逼呢?不管會不會,反正我第一次接觸的時候確實懵逼了下。這里給那些懵逼過的人提示下,我們可以通過打開GitHub上項目的子文件查看到相應(yīng)的依賴。比如GitHub上Retrofit項目中:retrofit/retrofit-converters/gson/
這個路徑下就可以查看到相應(yīng)的GsonConverter
的依賴。
public class HttpRequest { public static final long CONNECTTIME = 30000; public static final String BASE_URL = "http://jxhdapi.ooowin.com/"; private ApiService apiService; public HttpRequest() { //添加日志攔截器 HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() { @Override public void log(String message) { Log.d("TAG", "==========" + message); } }).setLevel(HttpLoggingInterceptor.Level.BODY); //獲取OkHttpClient OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(CONNECTTIME, TimeUnit.MICROSECONDS) .readTimeout(CONNECTTIME,TimeUnit.MICROSECONDS) .writeTimeout(CONNECTTIME,TimeUnit.MICROSECONDS) .addInterceptor(interceptor) .addNetworkInterceptor(new HttpHeaderInterceptor()) .build(); //初始化Retrofit Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .client(client) .build(); apiService = retrofit.create(ApiService.class); } // 創(chuàng)建單例 private static class SingletonHolder { private static final HttpRequest INSTANCE = new HttpRequest(); } public static ApiService getApi(){ return SingletonHolder.INSTANCE.apiService; } }
這里我們可以看到添加了兩個攔截器:日志攔截器和網(wǎng)絡(luò)請求Header攔截器,我們都知道對于Retrofit我們是可以直接通過GsonConverter
轉(zhuǎn)換成實體類的,但有的時候我們又想去獲取它的json數(shù)據(jù)進行查看,這個時候我們就可以通過添加日志攔截器實現(xiàn),但一定要給它設(shè)置setLevel
方法,設(shè)置不同的屬性打印出來的數(shù)據(jù)是不一樣的。至于添加Header攔截器我想大家都應(yīng)該知道,正常工作中接口所需要的Header都是相同的,所以我們要進行統(tǒng)一添加:
public class HttpHeaderInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Request build = request.newBuilder() // .addHeader("","") 添加header .build(); return chain.proceed(build); } }
{ "code": 1, "msg": "操作成功", "data": {······} }
通常我們從服務(wù)端拿到的json數(shù)據(jù)就像上面那樣,有些返回的字段內(nèi)容格式是固定的,比如:code和msg。有些則是不確定,如:data。這個時候我們就需要對其進行二次處理了,我們可以寫一個基類:
public class BaseBean<T> { private int code; private String msg; private T data; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public T getData() { return data; } public void setData(T data) { this.data = data; } }
利用泛型來表示data中的不確定格式的數(shù)據(jù),這里用一個獲取全國所有省的數(shù)據(jù)接口進行測試:
public interface ApiService { //獲取省列表 @GET("common/areas") Flowable<BaseBean<List<Province>>> province(); }
實體類封裝好后我們可以進行一下測試:
HttpRequest.getApi() .province() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<BaseBean<List<Province>>>() { @Override public void onSubscribe(Subscription s) { } @Override public void onNext(BaseBean<List<Province>> listBaseBean) { } @Override public void onError(Throwable t) { } @Override public void onComplete() { } }); }
通過上面的代碼我們不難看出這是經(jīng)過封裝后的效果,但是我們會發(fā)現(xiàn)這樣的請求我們難道每次都要去添加調(diào)度器和重寫Subscriber
的幾個方法嗎?那豈不還是很繁瑣。是的,接下來我們就對這些進行封裝。
public class SchedulersHelper implements FlowableTransformer{ @Override public Publisher apply(Flowable upstream) { return upstream.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } }
使用compose操作符可以直接對當(dāng)前Flowable進行操作,所以我們自然可以把切換線程的操作加入這里。接下來就是Subscriber進行封裝了。
public abstract class MySubscriber<T> implements Subscriber<T>{ @Override public void onSubscribe(Subscription s) { s.request(Long.MAX_VALUE); showLoading(); } @Override public void onNext(T t) { //code為1代表服務(wù)器返回成功的數(shù)據(jù) if (((BaseBean)t).getCode() == 1) { //成功后返回data數(shù)據(jù)進行處理即可 onSuccess((T) ((BaseBean) t).getData()); }else { //處理服務(wù)器返回錯誤code } } @Override public void onComplete() { finishLoading(); } @Override public void onError(Throwable t) { finishLoading(); //處理網(wǎng)絡(luò)異常 Log.d("TAG","=========" + t); } protected abstract void onSuccess(T t); protected abstract void showLoading(); protected abstract void finishLoading(); }
如上所示,我們根據(jù)服務(wù)端返回的code判斷是否成功,將data數(shù)據(jù)傳出去。服務(wù)器返回的錯誤碼和網(wǎng)絡(luò)請求錯誤我們都可以統(tǒng)一在這里進行處理。然后我們再去測試接口。
HttpRequest.getApi().province() .compose(new SchedulersHelper()) .subscribe(new MySubscriber() { @Override protected void onSuccess(Object o) { } @Override protected void showLoading() { } @Override protected void finishLoading() { } });
可以的看到操作流程已經(jīng)變的很簡單了,對于showLoading()
和finishLoading()
這兩個方法我們可以不需要放在這里面,這個是我方便測試便將其寫在里面了。
“Android RxJava與Retrofit怎么結(jié)合使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。