RxJava 使用場景小結

jopen 9年前發布 | 21K 次閱讀 RxJava Java開發

 

取數據先檢查緩存的場景

取數據,首先檢查內存是否有緩存

然后檢查文件緩存中是否有

最后才從網絡中取

前面任何一個條件滿足,就不會執行后面的

</div>

final Observable memory = Observable.create(new Observable.OnSubscribe() {
    @Override
    public void call(Subscriber super String> subscriber) {
        if (memoryCache != null) {
            subscriber.onNext(memoryCache);
        } else {
            subscriber.onCompleted();
        }
    }
});
Observable disk = Observable.create(new Observable.OnSubscribe() {
    @Override
    public void call(Subscriber super String> subscriber) {
        String cachePref = rxPreferences.getString("cache").get();
        if (!TextUtils.isEmpty(cachePref)) {
            subscriber.onNext(cachePref);
        } else {
            subscriber.onCompleted();
        }
    }
});

Observable network = Observable.just("network");

//主要就是靠concat operator來實現 Observable.concat(memory, disk, network) .first() .subscribeOn(Schedulers.newThread()) .subscribe(s -> { memoryCache = "memory"; System.out.println("--------------subscribe: " + s); });</pre>

finalObservablememory=Observable.create(newObservable.OnSubscribe(){
    @Override
    publicvoidcall(SubscribersuperString>subscriber){
        if(memoryCache!=null){
            subscriber.onNext(memoryCache);
        }else{
            subscriber.onCompleted();
        }
    }
});
Observable disk=Observable.create(newObservable.OnSubscribe(){
    @Override
    publicvoidcall(SubscribersuperString>subscriber){
        StringcachePref=rxPreferences.getString("cache").get();
        if(!TextUtils.isEmpty(cachePref)){
            subscriber.onNext(cachePref);
        }else{
            subscriber.onCompleted();
        }
    }
});

Observable network=Observable.just("network");

//主要就是靠concat operator來實現 Observable.concat(memory,disk,network) .first() .subscribeOn(Schedulers.newThread()) .subscribe(s->{ memoryCache="memory"; System.out.println("--------------subscribe: "+s); });</pre>

界面需要等到多個接口并發取完數據,再更新

//拼接兩個Observable的輸出,不保證順序,按照事件產生的順序發送給訂閱者
private void testMerge() {
    Observable observable1 = DemoUtils.createObservable1().subscribeOn(Schedulers.newThread());
    Observable observable2 = DemoUtils.createObservable2().subscribeOn(Schedulers.newThread());

Observable.merge(observable1, observable2)
        .subscribeOn(Schedulers.newThread())
        .subscribe(System.out::println);

}</pre>

//拼接兩個Observable的輸出,不保證順序,按照事件產生的順序發送給訂閱者
privatevoidtestMerge(){
    Observableobservable1=DemoUtils.createObservable1().subscribeOn(Schedulers.newThread());
    Observableobservable2=DemoUtils.createObservable2().subscribeOn(Schedulers.newThread());

Observable.merge(observable1,observable2)
        .subscribeOn(Schedulers.newThread())
        .subscribe(System.out::println);

}</pre>

一個接口的請求依賴另一個API請求返回的數據

舉個例子,我們經常在需要登陸之后,根據拿到的token去獲取消息列表。

這里用RxJava主要解決嵌套回調的問題,有一個專有名詞叫 Callback hell

NetworkService.getToken("username", "password")
    .flatMap(s -> NetworkService.getMessage(s))
    .subscribe(s -> {
        System.out.println("message: " + s);
    });

NetworkService.getToken("username","password")
    .flatMap(s->NetworkService.getMessage(s))
    .subscribe(s->{
        System.out.println("message: "+s);
    }); 

界面按鈕需要防止連續點擊的情況

RxView.clicks(findViewById(R.id.btn_throttle))
    .throttleFirst(1, TimeUnit.SECONDS)
    .subscribe(aVoid -> {
        System.out.println("click");
    });

RxView.clicks(findViewById(R.id.btn_throttle))
    .throttleFirst(1,TimeUnit.SECONDS)
    .subscribe(aVoid->{
        System.out.println("click");
    });

響應式的界面

比如勾選了某個checkbox,自動更新對應的preference

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
RxSharedPreferences rxPreferences = RxSharedPreferences.create(preferences);

Preference checked = rxPreferences.getBoolean("checked", true);

CheckBox checkBox = (CheckBox) findViewById(R.id.cb_test); RxCompoundButton.checkedChanges(checkBox) .subscribe(checked.asAction());</pre>

SharedPreferences preferences=PreferenceManager.getDefaultSharedPreferences(this);
RxSharedPreferences rxPreferences=RxSharedPreferences.create(preferences);

Preference checked=rxPreferences.getBoolean("checked",true);

CheckBox checkBox=(CheckBox)findViewById(R.id.cb_test); RxCompoundButton.checkedChanges(checkBox) .subscribe(checked.asAction());</pre>

復雜的數據變換

Observable.just("1", "2", "2", "3", "4", "5")
    .map(Integer::parseInt)
    .filter(s -> s > 1)
    .distinct()
    .take(3)
    .reduce((integer, integer2) -> integer.intValue() + integer2.intValue())
    .subscribe(System.out::println);//9

Observable.just("1","2","2","3","4","5")
    .map(Integer::parseInt)
    .filter(s->s>1)
    .distinct()
    .take(3)
    .reduce((integer,integer2)->integer.intValue()+integer2.intValue())
    .subscribe(System.out::println);//9


 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!