RxJava與Retrofit的使用案例

創(chuàng)建一個(gè)被觀察者畅哑,發(fā)起一個(gè)網(wǎng)絡(luò)請(qǐng)求迁杨。
observable

 Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Urls.baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
        GetRequest request=retrofit.create(GetRequest.class);
        Observable<Translation> observable=request.getCall1();

GetRequest代碼

public interface GetRequest  {

    @GET(Urls.test)
    Observable<Translation> getCall();

    @GET(Urls.test1)
    Observable<Translation> getCall1();

Translation代碼

public class Translation {

    private int status;
    private content content;
    private static class content{
        private String from;
        private String to;
        private String vendor;
        private String out;
        private int errNo;
    }
    public String show(){
        Log.e("yzh",content.out);
        return content.out;
    }
}

對(duì)retrofit不太了解的可以去看一下retrofit入門

1 模擬一次重復(fù)查詢的情況,使用了Rxjava的interval操作符
//最外面是一個(gè)循環(huán)的操作
  Observable.interval(2,1, TimeUnit.SECONDS)
                .doOnNext(new Consumer<Long>() {
                    @Override
                    public void accept(Long aLong) throws Exception {
                        Log.e("yzh","第"+aLong+"次輪詢");
                        //請(qǐng)求在這里執(zhí)行湃缎,注意看到線程的切換
                        observable.subscribeOn(Schedulers.io())
                                .observeOn(AndroidSchedulers.mainThread())
                                .subscribe(new Observer<Translation>() {
                                    @Override
                                    public void onSubscribe(Disposable d) {

                                    }

                                    @Override
                                    public void onNext(Translation translation) {
                                        translation.show();
                                    }

                                    @Override
                                    public void onError(Throwable e) {
                                        Log.e("yzh","請(qǐng)求失敗");
                                    }

                                    @Override
                                    public void onComplete() {

                                    }
                                });
                    }
                }).subscribe(new Observer<Long>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(Long aLong) {

            }

            @Override
            public void onError(Throwable e) {
                Log.e("yzh","對(duì)Error事件作出響應(yīng)");
            }

            @Override
            public void onComplete() {
                Log.e("yzh","對(duì)Complete事件作出響應(yīng)");
            }
        });

打印結(jié)果

//        03-12 14:56:16.528 8733-8760/com.example.issuser.rxtest E/yzh: 第0次輪詢
//        03-12 14:56:16.886 8733-8733/com.example.issuser.rxtest E/yzh: 嗨世界
//        03-12 14:56:17.528 8733-8760/com.example.issuser.rxtest E/yzh: 第1次輪詢
//        03-12 14:56:17.702 8733-8733/com.example.issuser.rxtest E/yzh: 嗨世界
//        03-12 14:56:18.529 8733-8760/com.example.issuser.rxtest E/yzh: 第2次輪詢
//        03-12 14:56:18.675 8733-8733/com.example.issuser.rxtest E/yzh: 嗨世界
//        03-12 14:56:19.528 8733-8760/com.example.issuser.rxtest E/yzh: 第3次輪詢
//        03-12 14:56:19.674 8733-8733/com.example.issuser.rxtest E/yzh: 嗨世界
2.條件輪詢 枪萄,使用RxJava的repeatWhen

被觀察者的網(wǎng)絡(luò)請(qǐng)求同上

observable.repeatWhen(new Function<Observable<Object>, ObservableSource<?>>() {
            @Override
            public ObservableSource<?> apply(Observable<Object> objectObservable) throws Exception {
                return objectObservable.flatMap(new Function<Object, ObservableSource<?>>() {
                    @Override
                    public ObservableSource<?> apply(Object o) throws Exception {
                        //設(shè)置輪詢條件
                        if(i>3){
                            return Observable.error(new Throwable("輪詢結(jié)束"));
                        }else{
                            return Observable.just(1).delay(2, TimeUnit.SECONDS);
                        }

                    }
                });
            }
        }).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Translation>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.e("yzh","onSubscribe");
                    }

                    @Override
                    public void onNext(Translation translation) {
                        translation.show();
                        i++;
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e("yzh","onError--"+e.toString());
                    }

                    @Override
                    public void onComplete() {

                    }
                });

打印結(jié)果

        03-12 15:25:00.524 12910-12910/com.example.issuser.rxtest E/yzh: onSubscribe
        03-12 15:25:00.715 12910-12910/com.example.issuser.rxtest E/yzh: hi china
        03-12 15:25:02.852 12910-12910/com.example.issuser.rxtest E/yzh: hi china
        03-12 15:25:05.092 12910-12910/com.example.issuser.rxtest E/yzh: hi china
        03-12 15:25:07.244 12910-12910/com.example.issuser.rxtest E/yzh: hi china
        03-12 15:25:09.382 12910-12910/com.example.issuser.rxtest E/yzh: hi china
        03-12 15:25:09.395 12910-12910/com.example.issuser.rxtest E/yzh: onError--java.lang.Throwable: 輪詢結(jié)束
3 網(wǎng)絡(luò)異常重連 這個(gè)是常見的情況但是不好模擬所以沒有打印結(jié)果

用到的是RxJava的retryWhen

observable.retryWhen(new Function<Observable<Throwable>, ObservableSource<?>>() {
           @Override
           public ObservableSource<?> apply(Observable<Throwable> throwableObservable) throws Exception {
               return throwableObservable.flatMap(new Function<Throwable, ObservableSource<?>>() {
                   @Override
                   public ObservableSource<?> apply(Throwable throwable) throws Exception {
                       Log.e("yzh","發(fā)生異常=="+throwable.toString());
                       if(throwable instanceof IOException){
                           Log.e("yzh","屬于IO異常决侈,重試");
                           if(currentRetryCount<maxConnectCount){
                               currentRetryCount++;
                               Log.e("yzh","重試的次數(shù)--"+currentRetryCount);
                               waitRetryTime=1000+currentRetryCount*1000;
                               Log.e("yzh","等待時(shí)間=="+waitRetryTime);
                                return Observable.just(1).delay(waitRetryTime, TimeUnit.MILLISECONDS);
                           }else{
                               return Observable.error(new Throwable("重試次數(shù)已超過設(shè)置次數(shù) = " +currentRetryCount  + ",即 不再重試"));

                           }
                       }else{
                           return Observable.error(new Throwable("發(fā)生了非網(wǎng)絡(luò)異常(非I/O異常)"));
                       }

                   }
               });
           }
       }).subscribeOn(Schedulers.io())
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe(new Observer<Translation>() {
                   @Override
                   public void onSubscribe(Disposable d) {

                   }

                   @Override
                   public void onNext(Translation translation) {
                       Log.e("yzh",  "發(fā)送成功");
                       translation.show();
                   }

                   @Override
                   public void onError(Throwable e) {
                        Log.e("yzh",e.toString());
                   }

                   @Override
                   public void onComplete() {

                   }
               });
4 對(duì)網(wǎng)絡(luò)請(qǐng)求返回的數(shù)據(jù)再做一次處理牵舱,用到RxJava的flatmap

常見的使用場(chǎng)景是注冊(cè)并且直接登錄這個(gè)場(chǎng)景串绩,注意線程的切換

observable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnNext(new Consumer<Translation>() {
                    @Override
                    public void accept(Translation translation) throws Exception {
                        Log.e("yzh","doOnNextThread--"+Thread.currentThread().getName());
                        Log.e("yzh","第一次網(wǎng)絡(luò)請(qǐng)求成功");
                        translation.show();
                    }
                })
                //切換觀察者所在線程
                .observeOn(Schedulers.io())
                .flatMap(new Function<Translation, ObservableSource<Translation>>() {
                    @Override
                    public ObservableSource<Translation> apply(Translation translation) throws Exception {
                        Log.e("yzh","flatMapThread--"+Thread.currentThread().getName());
                        Log.e("yzh","flatmap--");
                        translation.show();
                        //另一個(gè)網(wǎng)絡(luò)請(qǐng)求,這里就不詳細(xì)列舉了
                        return observable1;
                    }
                })
                //切換觀察者所在線程
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<Translation>() {
                    @Override
                    public void accept(Translation translation) throws Exception {
                        Log.e("yzh","acceptThread--"+Thread.currentThread().getName());
                        Log.e("yzh","accept--");
                        translation.show();
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                    }
                });

打印結(jié)果 注意在第二次請(qǐng)求時(shí) 觀察者所在線程的切換

03-12 11:50:40.681 11667-11667/com.example.issuser.rxtest E/yzh: doOnNextThread--main
03-12 11:50:40.681 11667-11667/com.example.issuser.rxtest E/yzh: 第一次網(wǎng)絡(luò)請(qǐng)求成功
03-12 11:50:40.681 11667-11667/com.example.issuser.rxtest E/yzh: 嗨世界
03-12 11:50:40.681 11667-11720/com.example.issuser.rxtest E/yzh: flatMapThread--RxCachedThreadScheduler-2
03-12 11:50:40.681 11667-11720/com.example.issuser.rxtest E/yzh: flatmap--
03-12 11:50:40.681 11667-11720/com.example.issuser.rxtest E/yzh: 嗨世界
03-12 11:50:40.949 11667-11667/com.example.issuser.rxtest E/yzh: acceptThread--main
03-12 11:50:40.949 11667-11667/com.example.issuser.rxtest E/yzh: accept--
03-12 11:50:40.949 11667-11667/com.example.issuser.rxtest E/yzh: hi china
5 聯(lián)合判斷多個(gè)條件 應(yīng)用于登錄注冊(cè)等需要填完多個(gè)信息

a. RxTextView.textChanges()監(jiān)聽控件的數(shù)據(jù)變化 芜壁,需要引入依賴:compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
b. skip(1) 跳過控件一開始無任何輸入值的情況

Observable<CharSequence> nameObservable = RxTextView.textChanges(et_name).skip(1);
 Observable<CharSequence> ageObservable = RxTextView.textChanges(et_age).skip(1);
 Observable<CharSequence> jobObservable = RxTextView.textChanges(et_job).skip(1);
Observable.combineLatest(nameObservable, ageObservable, jobObservable, new Function3<CharSequence, CharSequence, CharSequence, Boolean>() {
            @Override
            public Boolean apply(CharSequence charSequence, CharSequence charSequence2, CharSequence charSequence3) throws Exception {
                boolean isUserNameValid= !TextUtils.isEmpty(et_name.getText().toString());
                boolean isUserAgeValid=!TextUtils.isEmpty(et_age.getText().toString());
                boolean isUserJobValid=!TextUtils.isEmpty(et_job.getText().toString());

                return isUserNameValid&isUserAgeValid&isUserJobValid;
            }
        }).subscribe(new Consumer<Boolean>() {
            @Override
            public void accept(Boolean aBoolean) throws Exception {
                Log.e("yzh","提交按鈕是否可以點(diǎn)擊--"+aBoolean);
            }
        });
6 使用RxJava時(shí)要注意的內(nèi)存泄露礁凡,例如有時(shí)候頁面結(jié)束 異步操作并未完成
//        防止activity結(jié)束 出現(xiàn)問題
          private final CompositeDisposable disposables = new CompositeDisposable();
          disposables.add(observer);
          @Override
          protected void onDestroy() {
              super.onDestroy();
              // 將所有的 observer 取消訂閱
              disposables.clear();
         }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市慧妄,隨后出現(xiàn)的幾起案子顷牌,更是在濱河造成了極大的恐慌,老刑警劉巖塞淹,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窟蓝,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡饱普,警方通過查閱死者的電腦和手機(jī)运挫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來套耕,“玉大人谁帕,你說我怎么就攤上這事》肱郏” “怎么了匈挖?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)颠猴。 經(jīng)常有香客問我关划,道長(zhǎng),這世上最難降的妖魔是什么翘瓮? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮裤翩,結(jié)果婚禮上资盅,老公的妹妹穿的比我還像新娘。我一直安慰自己踊赠,他們只是感情好呵扛,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著筐带,像睡著了一般今穿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伦籍,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天蓝晒,我揣著相機(jī)與錄音腮出,去河邊找鬼。 笑死芝薇,一個(gè)胖子當(dāng)著我的面吹牛胚嘲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播洛二,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼馋劈,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了晾嘶?” 一聲冷哼從身側(cè)響起妓雾,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎垒迂,沒想到半個(gè)月后械姻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡娇斑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年策添,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毫缆。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唯竹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出苦丁,到底是詐尸還是另有隱情浸颓,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布旺拉,位于F島的核電站产上,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蛾狗。R本人自食惡果不足惜晋涣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沉桌。 院中可真熱鬧谢鹊,春花似錦、人聲如沸留凭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔼夜。三九已至兼耀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瘤运。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工窍霞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尽超。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓官撼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親似谁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子傲绣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345