RxJava 使用場景小結
您的評價: |
|
0.0 |
很差
|
取數據先檢查緩存的場景
取數據,首先檢查內存是否有緩存
然後檢查文件緩存中是否有
最後才從網絡中取
前面任何一個條件滿足,就不會執行後面的
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);
});
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);
});
界面需要等到多個接口併發取完數據,再更新
//拼接兩個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);
}
//拼接兩個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);
}
一個接口的請求依賴另一個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());
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());
複雜的數據變換
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
http://www.open-open.com/lib/view/open1450164844282.html