天天看點

Retrofit結合RxJava2使用

###相關文章

  • 觀察者模式執行個體講解
  • 使用java中的類(Observable與Observer)實作觀察者模式
  • Rx_java2的基本使用
  • Rx_java2中的線程控制
  • Rx_java2操作符介紹1(Map、Flatmap)
  • Rx_java2操作符介紹2(debounce 、filter 、switchMap )
  • Rx_java2操作符介紹3(throttleFirst、debounce )

    ###寫在前面

  • Retrofit: Retrofit是Square公司開源的一個高品質高效率的http庫,它将我們自己開發的底層代碼和細節都封裝了起來。在沒有Retrofit,okHttp等庫的時候,我們可能要自己去寫put,get,post,delete請求。但有了這些庫之後對于這些請求我們就隻需要一行代碼或者是一個注解。更多資訊參考Retrofit文檔
  • **RxJava:**關于RxJava的詳細介紹,大家可以到這裡下載下傳去看RxJava中文文檔,然後對比我的RxJava系列講解去系統的學習RxJava的使用。

添加依賴,

首先,我們需要在build.gradle檔案中添加依賴

// Rx依賴
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'io.reactivex.rxjava2:rxjava:2.1.7'

    // retrofit
    compile 'com.squareup.retrofit2:retrofit:2.3.0'
    // r将retrofit結果轉換為對象模型
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'
    // Rx與Retrofit結合依賴
    compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
           

接下來,我将通過案例的方式來介紹RxJava和Retrofit結合使用帶來的便捷,并且與不使用RxJava方式作對比:

###案列伺服器資料介紹

伺服器我簡單的使用的tomcat,擷取倆個json字元串

主機位址使用我自己的ip位址http://192.168.1.123:8080/

登入接口為 retrofitDemo/login.json

擷取使用者接口為retrofitDemo/userInfo.json

擷取到的json資料分别為

// 登陸成功
{"success":true,"message":"login success !","user_id":110}
// 擷取使用者資訊‘
{"username":"dujun","head_url":"www.baidu.com","id":"110"}
           

###傳統方式(不用RxJava方式) - 登入,并擷取使用者資訊(僅用retrofit)案例

首相,建立Retrofit的Api接口,

/**
 * description:
 * author: dujun
 * created at: 2018/1/10 11:54 
 * update: 2018/1/10
 * version: 
 */
public interface Api {
    /**
     * 登入
     * @param userParam
     * @return
     */
    @POST("retrofitDemo/login.json")
    Call<BaseResult> login(@Body UserParam userParam);

    /**
     * 擷取使用者資訊
     * @param userParam
     * @return
     */
    @POST("retrofitDemo/userInfo.json")
    Call<User> getUserInfo(@Body UserParam userParam);
}
           

然後建立Retrofit,并建立Api

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://192.168.1.123:8080/")
                // 添加Gson轉換,結果将會自動轉化為資料模型
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        api = retrofit.create(Api.class);
           

調用api中的登入方法登入,,登入成功後,再調用api中的擷取使用者資訊接口,擷取使用者資訊

public void login(View view){
        api.login(new UserParam("dujun","123456")).enqueue(new Callback<BaseResult>() {
            @Override
            public void onResponse(Call<BaseResult> call, Response<BaseResult> response) {
                // 擷取請求結果,此處在ui線程
                if(response != null){
                    BaseResult result = response.body();
                    // 登入成功,繼續擷取使用者資訊
                    api.getUserInfo(result.user_id).enqueue(new Callback<User>() {
                        @Override
                        public void onResponse(Call<User> call, Response<User> response) {
                            User body = response.body();

                            // 擷取使用者資訊,并顯示在界面上
                            StringBuilder builder = new StringBuilder();
                                                        String userString = builder.append("head_url : " + body.head_url).append("         ").append("user_id : " + body.id).append(" ").append("username : " + body.username).toString();

                            mTv.setText(userString);
                        }

                        @Override
                        public void onFailure(Call<User> call, Throwable t) {

                        }
                    });
                }
            }

            @Override
            public void onFailure(Call<BaseResult> call, Throwable t) {

            }
        });

    }
           

####結果示範

Retrofit結合RxJava2使用

注:可以到這裡去下載下傳Gif圖檔錄制軟體

可以看到,首先通過retrofit登陸成功。擷取到使用者id。然後再次通過id去擷取使用者資訊。并顯示在界面上。

Retrofit和Rxjava結合使用- 登入,成功後擷取使用者資訊案例、

首相,我們要添加轉換器

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://192.168.1.123:8080/")
                // 添加Gson轉換,結果将會自動轉化為資料模型
                .addConverterFactory(GsonConverterFactory.create())
                
                // 添加RxJava轉換
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
           

**注意:**不加或者參數類型不對,報異常: Could not locate call adapter for io.reactivex.Observable…

接下來,我們直接修改Api接口中方法的傳回值為Observable

/**
     * RxJava和Retrofit結合完成登入操作
     * @param userParam
     * @return
     */
    @POST("retrofitDemo/login.json")
    Observable<BaseResult> loginWithRxJava(@Body UserParam userParam);

    /**
     * Rxjava和Retrofit結合完成擷取使用者資訊操作
     * @param
     * @return
     */
    @POST("retrofitDemo/userInfo.json")
    Observable<User> getUserInfoWithRxJava(@Body int userId);
           

在代碼中調用方法, 注釋中已經詳細介紹。

public void loginRxJava(View view){
        // 登入
        api.loginWithRxJava(new UserParam("dujun", "123456"))

        // flatMap轉換操作,将BaseResult轉換為ObservableSource<User>>發射器(被觀察者對象)
        .flatMap(new Function<BaseResult, ObservableSource<User>>() {
            @Override
            public ObservableSource<User> apply(@NonNull BaseResult baseResult) throws Exception {
                // 聯網擷取使用者資訊
                Observable<User> observable1 = api.getUserInfoWithRxJava(baseResult.user_id);
                return observable1;
            }
        })
                // 将Observable執行的操作放在子線程(請求網絡擷取資料)
        .subscribeOn(Schedulers.io())
        // 将Observer執行的操作放在ui線程
        .observeOn(AndroidSchedulers.mainThread())

        // 注冊綁定Observer
        .subscribe(new Observer<User>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {

            }

            @Override
            public void onNext(@NonNull User user) {
                // 擷取users資料,并顯示在界面
                StringBuilder builder = new StringBuilder();
                String userString = builder.append("RxJava和Retrofit結合擷取的資料:").append("head_url : " + user.head_url).append("         ").append("user_id : " + user.id).append("    ").append("username : " + user.username).toString();
                mTv.setText(userString);
            }

            @Override
            public void onError(@NonNull Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });
    }
           

####結果展示

Retrofit結合RxJava2使用

注:可以到這裡去下載下傳Gif圖檔錄制軟體

從圖中可以看出,倆中方式都擷取到了最終的使用者資訊。

###寫在後面

從上面的例子可以看出。Retrofit和Rxjava2結合使用方式,大大的簡化了我們的代碼,後期維護也變的很簡單。

###一些實用工具文旦下載下傳位址:

Gif圖檔錄制軟體:Gif圖檔錄制軟體,可以幫助錄制電腦螢幕上任意大小内容任意時間長度,而且還可以自己調節内容,可以斷點續錄。

RxJava中文文檔:Rxjava目前來說是非常流行的異步架構,掌握Rxjava可以在工作中得心應手,這裡提供Rxjava中文文檔。可以幫助你更好更快的掌握這項技術。

GifView(Gif圖檔播放器):Gif圖檔播放器,可以幫助你,像看電影一樣,調節圖播放的進度,而且還可以暫停播放

Android逆向助手:反編譯别人的App是不道德的,但是,如果是為了純粹的學習,提升自己,還是可以的,Android逆向助手,可以幫助你,擷取到你想要的