rxjava2 結合retrofit2進行業務封裝

rxjava2 結合retrofit2進行業務封裝

第一步 添加依賴:

    compile 'io.reactivex.rxjava2:rxjava:2.0.0'
    compile 'io.reactivex.rxjava2:rxandroid:2.0.0'
    compile 'com.squareup.retrofit2:converter-jackson:2.0.0'
    compile 'com.squareup.retrofit2:retrofit:2.2.0' 

第二步 定義一個接口類 例如:

public interface UserService {
@FormUrlEncoded
@POST("user/getchecknum")
Observable<BaseEntity<ChecknumBean>> getCheckNumber(@Field("phoneNum") String phoneNum);
}

@FormUrlEncoded爲URL編碼 retrofit2.x必須要
@POST(“user/getchecknum”) 定義一個POST請求 user/getchecknum 爲URL的一部分
getCheckNumber爲一個普通的方法後來會調用 返回一個Observable,Observable的泛型爲返回的數據用BaseEntity來接收
來看下BaseEntity:

public class BaseEntity<T> implements Serializable {
    private int returnCode;
    private String returnMsg;
    private T data;
      public int getReturnCode() {
        return returnCode;
    }

    public void setReturnCode(int returnCode) {
        this.returnCode = returnCode;
    }

    public String getReturnMsg() {
        return returnMsg;
    }

    public void setReturnMsg(String returnMsg) {
        this.returnMsg = returnMsg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

再來看ChecknumBean:

        public class ChecknumBean {
            private String checkNum;

            public String getCheckNum() {
                return checkNum;
            }

            public void setCheckNum(String checkNum) {
                this.checkNum = checkNum;
            }
        }

第三步 創建Retrofit

我是這麼創建的 你可以根據業務來創建:

public class RetroFactory {

    private RetroFactory() {
    }

    private static String baseUrl = "http://58.213.75.45/gaojie/";

    private static OkHttpClient httpClient = new OkHttpClient.Builder()
            .connectTimeout(30, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS)
            .build();

    private static UserService userService = new Retrofit.Builder()
            .baseUrl(baseUrl)
            .addConverterFactory(JacksonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .client(httpClient)
            .build()
            .create(UserService.class);
    public static UserService getUserService() {
        return userService;
    }
}

發送請求

RetroFactory.getUserService().getCheckNumber("13888888888")
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<BaseEntity<ChecknumBean>>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                    }

                    @Override
                    public void onNext(BaseEntity<ChecknumBean> value) {
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });

這是最簡單的用法了. 用的最原始的Observer 返回的數據有成功 有失敗 情況很多 我們可以創建個BaseObserver 來進行數據的預處理:

public abstract class MyObserver<T> implements Observer<BaseEntity<T>> {
    @Override
    public void onSubscribe(Disposable d) {
    }


    @Override
    public void onNext(BaseEntity<T> value) {
        if (value.getReturnCode() == 0) {
            onHandleSuccess(value.getData());
        } else {
            onHandleError(value.getReturnCode(),value.getReturnMsg());
        }
    }
    protected abstract void onHandleSuccess(T data);

    protected abstract void onHandleError(int returnCode, String returnMsg);
    @Override
    public void onError(Throwable e) {

    }

    @Override
    public void onComplete() {

    }
}

在這個預處理中我只是根據我自己的實際情況來做的 我們後來返回的returnCode==0的時候纔算真正的成功 其他returnCode爲其他情況 所以我就抽出兩個方法讓子類實現
在onError(Throwable e)中可以對異常進行統一的處理 就不用交個子類處理了
再次請求就是這麼寫了:

RetroFactory.getUserService().getCheckNumber("1388888888")
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new MyObserver<ChecknumBean>() {
                    @Override
                    protected void onHandleSuccess(ChecknumBean data) {

                    }

                    @Override
                    protected void onHandleError(int returnCode, String returnMsg) {

                    }
                });
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章