1.線程切換
subscribeOn()
observeOn()
subscribeOn()和observeOn()的區別:
- subscribeOn()主要改變的是訂閱的線程,即call()執行的線程;
- observeOn()主要改變的是發送的線程,即onNext()執行的線程。
Scheduler進程調度
Schedulers.immediate():默認的,當前線程
Schedulers.newThread():新建的線程
Schedulers.io():采用了線程池,內部是一個不限制線程數量的線程池,用于io操作
Schedulers.comutation():線程池,線程池中的線程數量取決于CPU的核數,通常用于CPU密集操作,如:數據讀寫操作、解析,圖形處理
2.flatmap 接口依賴
返回Observable,處理嵌套請求
我有時候用來做連續請求,比如首頁多類型的請求
3.merge 接口合并
Observable<T> a=xxx;
Observable<T> b=xxx;
Observable.merge(a,b).subscribe(xxx);
接口結果類型相同的時候可以直接Observable<T>
接口結果類型不同的時候可以用?代替T
只有當這兩個請求都完成后才能更新UI
4.concat 構建多級緩存
Observable.concat(getFromMemory(),getFromDisk(),getFromNet())
.takeFirst(new Func1<Bitmap,Boolean>(){...});//別忘了takeFirst
不要忘記用takeFirst(),concat按順序將它們串聯。
5.timer 定時器
Observable.timer(2,TimeUnit.SECONDS).subscribe();
6.interval 周期任務
Observable.interval(5,TimeUnit.SECONDS).subscribe();
7.filter 數據過濾
Observable.from(list).filter(new Func1<String,Boolean>){
@Override
public Boolean call(String s){
return !TextUtils.isEmpty(s);
}
}
8.throttleFirst 界面防抖動
防止多次點擊,重復打開界面,類似于自己寫的NoDoubleClickListener
RxView.clicks(btn).throttleFirst(1L,TimeUnit.SECONDS).subscribe();
9.just 老接口適配
將一些方法返回類型轉為Observable
Observable.just(x,y).subscribe(new Action1<Integer>(){
@Override
public void call(Integer result){
print(result);
}
});
10.響應式界面
例如登錄的時候,只有用戶名和密碼都不空的時候,登錄按鈕才可點擊
Observable<String> username=RxTextView.textChanges(usernameEditText);
Observable<String> psd=RxTextView.textChanges(pswEditText);
Observable.combintLatest(username,psd,new Func2<String,String,Boolean>(){
@Override
public Boolean call(String username,String psd){
return !TextUtils.isEmpty(username)&&!TextUtils.isEmpty(psd);
}
}).subscribe(xxx);
11.map
處理數據,可以返回不同數據的Observable
12.connect 廣播
同時發送消息進行操作
ConnectObservable<T> broadcastObservable=myFirstObservable.
subscribeOn(Schedulers.computation())
.map(xxx)
.publish();//記住要publish
broadcastObservable.subscribeOn(Schedulers.io())
.subscribe(xxx);
broadcastObservable.observeOn(AndroidSchedulers.mainThread())
.subscribe(xxx);
broadcaseObservable.connect();//最后要connect(),只有在調用connect后才會發送數據
要注意的地方
主動取消訂閱,防止內存泄漏。一般在BaseActivity或者BaseFragment中統一取消訂閱,還可以用RxLifeCycle庫來取消訂閱,幫我們在組件聲明周期的某個階段自動取消訂閱。
提供了bindToLifeCycle()和bindUntilEvent()來綁定生命周期和事件。
bindToLifeCycle:
activity需要繼承RxAppCompatActivity
在onResume中綁定的話,會在對應的onPause里邊取消綁定
onStart訂閱->onStop中取消
onCreate訂閱->onDestory取消
bindUntilEvent:
activity需要繼承RxAppCompatActivity
在類似onclick事件中綁定,在onPause里邊解除綁定