RxJava 使用場景小結
取數據先檢查緩存的場景
取數據,首先檢查內存是否有緩存
然后檢查文件緩存中是否有
最后才從網絡中取
前面任何一個條件滿足,就不會執行后面的
</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