rxjava實(shí)用示例

每隔兩秒執(zhí)行一次

Observable.interval(2, 2, TimeUnit.SECONDS).subscribe(new Action1<Long>() {
        @Override
        public void call(Long aLong) {
            //TODO WHAT YOU WANT
        }
    });

在兩秒后去執(zhí)行一些操作(比如啟動(dòng)頁跳轉(zhuǎn)到主頁面)

Observable.timer(2, TimeUnit.SECONDS).subscribe(new Action1<Long>() {
        @Override
        public void call(Long aLong) {
            //TODO WHAT YOU WANT
        }
    });

模擬發(fā)送驗(yàn)證碼,count秒鐘后可再次點(diǎn)擊

Observable.interval(0, 1, TimeUnit.SECONDS)
            .take(count + 1)
            .map(new Function<Long, Long>() {
                @Override
                public Long apply(@NonNull Long aLong) throws Exception {
                    return count - aLong;
                }
            })
            .observeOn(AndroidSchedulers.mainThread())
             //訂閱時(shí)執(zhí)行
            .doOnSubscribe(new Consumer<Disposable>() {
                @Override
                public void accept(@NonNull Disposable disposable) throws Exception {
                    button.setEnabled(false);
                }
            })
            .subscribe(new Observer<Long>() {
                @Override
                public void onSubscribe(Disposable d) {}
                @Override
                public void onNext(Long aLong) {
                    button.setText("剩余" + aLong + "秒");
                }
                @Override
                public void onError(Throwable e) {}
                @Override
                public void onComplete() {
                    //恢復(fù)狀態(tài)
                    button.setEnabled(true);
                    button.setText("發(fā)送驗(yàn)證碼");
                }
            });

登錄框按鈕狀態(tài)判斷

    Observable<CharSequence> ObservableName = RxTextView.textChanges(mEtPhone);
    Observable<CharSequence> ObservablePassword = RxTextView.textChanges(mEtPassword);

    Observable.combineLatest(ObservableName, ObservablePassword, new Func2<CharSequence, CharSequence, Boolean>() {
        @Override
        public Boolean call(CharSequence phone, CharSequence password) {
            return isPhoneValid(phone.toString()) && isPasswordValid(password.toString());
        }
    }).subscribe(new Action1<Boolean>() {
        @Override
        public void call(Boolean aBoolean) {
            RxView.enabled(mBtLogin).call(aBoolean);
        }
    });

緩存策略

    //內(nèi)存,磁盤,網(wǎng)絡(luò)有一個(gè)有值即返回
    Observable source = Observable
    .concat(memory, disk, network)
    .first(new Func1() {
      @Override public Boolean call(Data data) {
      return data.isUpToDate();
    }
});

合并兩個(gè)數(shù)據(jù)源場(chǎng)景

    //合并本地及網(wǎng)絡(luò)數(shù)據(jù),如離線加入購物車等 
    Observable.merge(getLocal(), getNet())  
       .observeOn(AndroidSchedulers.mainThread())  
          .subscribe(new Subscriber<String>() {  
              @Override  
              public void onCompleted() {  
                 Log.d(TAG, "onCompleted: onCompleted");
             }  

             @Override  
              public void onError(Throwable e) {  
                Log.d(TAG, "onError: onError");
              }  

              @Override  
              public void onNext(String data) {  
                   Log.d(TAG, "onNext: only one ! ");
         });

把多個(gè)網(wǎng)絡(luò)結(jié)果合并成一個(gè)

Observable<UserAndEvents> combined = Observable.zip(userObservable, eventsObservable, new Func2<JsonObject, JsonArray, UserAndEvents>() {
  @Override
  public UserAndEvents call(JsonObject jsonObject, JsonArray jsonElements) {
    return new UserAndEvents(jsonObject, jsonElements);
  }
});

快速切換線程

Observable.Transformer schedulersTransformer() {
        return new Observable.Transformer() {
            @Override
            public Object call(Object observable) {
                return ((Observable)  observable).subscribeOn(Schedulers.io())
                        .unsubscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread());
            }
        };
    }
observable.compose (schedulersTransformer()).subscribe(subscriber)
//上面的等價(jià)于下面的
observable.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);

使用schedulePeriodically做輪詢請(qǐng)求

    Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(final Subscriber<? super String> observer) {

            Schedulers.newThread().createWorker()
                  .schedulePeriodically(new Action0() {
                      @Override
                      public void call() {
                          observer.onNext(doNetworkCallAndGetStringResult());
                      }
                  }, INITIAL_DELAY, POLLING_INTERVAL, TimeUnit.MILLISECONDS);
        }
    }).subscribe(new Action1<String>() {
        @Override
        public void call(String s) {
            log.d("polling….”));
        }
    })

RxBinding

防止一個(gè)按鈕重復(fù)點(diǎn)擊

RxView.clicks(button).debounce(300, TimeUnit.MILLISECONDS).subscribe(new Action1<Void>() {
        @Override
        public void call(Void aVoid) {
            Log.i("test", "clicked");
        }
    });
    //throttleFirst與throttleLast/sample不同,在每個(gè)采樣周期內(nèi),它總是發(fā)射原始Observable的第一項(xiàng)數(shù)據(jù),而不是最近的一項(xiàng)。
    RxView.clicks(button).throttleFirst(300, TimeUnit.SECONDS)
            .subscribe(new Observer<Object>() {
                @Override
                public void onSubscribe(Disposable d) {}
                @Override
                public void onNext(Object o) {
                    System.out.println("俊俊俊點(diǎn)擊了按鈕");
                }
                @Override
                public void onError(Throwable e) {}
                @Override
                public void onComplete() {}
            });

優(yōu)化網(wǎng)絡(luò)搜索

RxTextView.textChanges(edittext)
            //當(dāng)你敲完字之后停下來的半秒就會(huì)執(zhí)行下面語句
            .debounce(500, TimeUnit.MILLISECONDS)
            //下面這兩個(gè)都是數(shù)據(jù)轉(zhuǎn)換
            //flatMap:當(dāng)同時(shí)多個(gè)網(wǎng)絡(luò)請(qǐng)求訪問的時(shí)候,前面的網(wǎng)絡(luò)數(shù)據(jù)會(huì)覆蓋后面的網(wǎng)絡(luò)數(shù)據(jù)
            //switchMap:當(dāng)同時(shí)多個(gè)網(wǎng)絡(luò)請(qǐng)求訪問的時(shí)候,會(huì)以最后一個(gè)發(fā)送請(qǐng)求為準(zhǔn),前面網(wǎng)路數(shù)據(jù)會(huì)被最后一個(gè)覆蓋
            .switchMap(new Function<CharSequence, ObservableSource<List<String>>>() {
                @Override
                public ObservableSource<List<String>> apply(@NonNull CharSequence charSequence) throws Exception {
                    //網(wǎng)絡(luò)操作,獲取我們需要的數(shù)據(jù)
                    List<String> list = new ArrayList<String>();
                    list.add("2017年款最新帥哥俊俊俊");
                    list.add("找不到2017年比俊俊俊更帥的人");
                    return Observable.just(list);
                }
            })
            //網(wǎng)絡(luò)請(qǐng)求是在子線程的
            .subscribeOn(Schedulers.io())
            //界面更新在主線程
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<List<String>>() {
                @Override
                public void accept(@NonNull List<String> strings) throws Exception {
                    //界面更新,這里用打印替代
                    System.out.println(strings.toString());
                }
            });

RxPermissions

請(qǐng)求相機(jī)權(quán)限

RxPermissions.getInstance(this)
.request(Manifest.permission.CAMERA)
.subscribe(granted -> {
    if (granted) { // 用戶同意了(在6.0之前的手機(jī)始終都為true)
      //可以拍照了
    } else {
       //可以在這里提示用戶,或者再次請(qǐng)求
    }
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,039評(píng)論 25 709
  • 1.RxJava是什么 2.在Android中怎么去使用RxJava 3.RxJava操作符的介紹 4.RxJav...
    我的資訊圈閱讀 578評(píng)論 0 0
  • 文/黃小妞 我的順產(chǎn)經(jīng)歷是一段我不愿提及又刻骨銘心的經(jīng)歷。 一直很想記錄下生孩子的整個(gè)經(jīng)歷,將來給自己留一份紀(jì)念,...
    黃小妞兒閱讀 1,103評(píng)論 1 4
  • w
    元寶寶寶寶閱讀 113評(píng)論 0 0
  • 入夜聞聲, 雨水不斷。 人躺在床上, 滿屋靜寂。 只一句 今夜過后,便是明天!
    NeverMore_Love閱讀 376評(píng)論 0 0

友情鏈接更多精彩內(nèi)容