91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android?RxJava與Retrofit怎么結合使用

發布時間:2023-03-13 14:37:10 來源:億速云 閱讀:142 作者:iii 欄目:開發技術

本篇內容介紹了“Android RxJava與Retrofit怎么結合使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

添加依賴

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'

添加依賴本并不想多說,我想大家都知道,但是對于剛接觸這些知識的時候我想有沒有人在看網上的文章時會覺得有些依賴是在哪找到并添加的呢?例如:com.squareup.retrofit2:converter-gson:2.3.0我們要添加一個GsonConverter的依賴。對于剛接觸這些知識和不經常逛GitHub的人來說會不會一臉懵逼呢?不管會不會,反正我第一次接觸的時候確實懵逼了下。這里給那些懵逼過的人提示下,我們可以通過打開GitHub上項目的子文件查看到相應的依賴。比如GitHub上Retrofit項目中:retrofit/retrofit-converters/gson/這個路徑下就可以查看到相應的GsonConverter的依賴。

封裝Retrofit(單例模式)

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);
    }
    //  創建單例
    private static class SingletonHolder {
        private static final HttpRequest INSTANCE = new HttpRequest();
    }
    public static ApiService getApi(){
        return SingletonHolder.INSTANCE.apiService;
    }
}

這里我們可以看到添加了兩個攔截器:日志攔截器和網絡請求Header攔截器,我們都知道對于Retrofit我們是可以直接通過GsonConverter轉換成實體類的,但有的時候我們又想去獲取它的json數據進行查看,這個時候我們就可以通過添加日志攔截器實現,但一定要給它設置setLevel方法,設置不同的屬性打印出來的數據是不一樣的。至于添加Header攔截器我想大家都應該知道,正常工作中接口所需要的Header都是相同的,所以我們要進行統一添加:

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": {······}
}

通常我們從服務端拿到的json數據就像上面那樣,有些返回的字段內容格式是固定的,比如: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中的不確定格式的數據,這里用一個獲取全國所有省的數據接口進行測試:

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() {
                }
            });
}

通過上面的代碼我們不難看出這是經過封裝后的效果,但是我們會發現這樣的請求我們難道每次都要去添加調度器和重寫Subscriber的幾個方法嗎?那豈不還是很繁瑣。是的,接下來我們就對這些進行封裝。

使用compose操作符

public class SchedulersHelper implements FlowableTransformer{
    @Override
    public Publisher apply(Flowable upstream) {
        return  upstream.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread());
    }
}

使用compose操作符可以直接對當前Flowable進行操作,所以我們自然可以把切換線程的操作加入這里。接下來就是Subscriber進行封裝了。

封裝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代表服務器返回成功的數據
        if (((BaseBean)t).getCode() == 1) {
            //成功后返回data數據進行處理即可
            onSuccess((T) ((BaseBean) t).getData());
        }else {
            //處理服務器返回錯誤code
        }
    }
    @Override
    public void onComplete() {
        finishLoading();
    }
    @Override
    public void onError(Throwable t) {
        finishLoading();
        //處理網絡異常
        Log.d("TAG","=========" + t);
    }
    protected abstract void onSuccess(T t);
    protected abstract void showLoading();
    protected abstract void finishLoading();
}

如上所示,我們根據服務端返回的code判斷是否成功,將data數據傳出去。服務器返回的錯誤碼和網絡請求錯誤我們都可以統一在這里進行處理。然后我們再去測試接口。

測試

HttpRequest.getApi().province()
        .compose(new SchedulersHelper())
        .subscribe(new MySubscriber() {
            @Override
            protected void onSuccess(Object o) {
            }
            @Override
            protected void showLoading() {
            }
            @Override
            protected void finishLoading() {
            }
        });

可以的看到操作流程已經變的很簡單了,對于showLoading()finishLoading()這兩個方法我們可以不需要放在這里面,這個是我方便測試便將其寫在里面了。

“Android RxJava與Retrofit怎么結合使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

通州市| 博野县| 新津县| 平邑县| 武平县| 高碑店市| 左贡县| 伊川县| 扶余县| 德清县| 万山特区| 巴彦淖尔市| 大兴区| 吴江市| 庐江县| 鄂托克旗| 广东省| 三门峡市| 凤凰县| 沁阳市| 信丰县| 德兴市| 平山县| 建水县| 广水市| 阿鲁科尔沁旗| 调兵山市| 瓦房店市| 牟定县| 宁都县| 山丹县| 池州市| 浪卡子县| 南安市| 昭通市| 诸暨市| 广州市| 中江县| 绿春县| 长阳| 体育|