rxJava&rxAndroid-實際運用(1)
整理自:
http://blog.chinaunix.net/uid-20771867-id-5187376.html
1、使用subscriber的如下方式來建立Obserable
Observable.create(new Observable.OnSubscribe< ArrayList<Song> >() {
@Override
public void call(Subscriber<? super ArrayList<Song>> subscriber){···}
Subscriber的onNext方法不會自動執行,需要在call方法中手動呼叫
Observable observable = Observable.create(new Observable.OnSubscribe< ArrayList<Song> >() {
@Override
public void call(Subscriber<? super ArrayList<Song>> subscriber)
{
SongScanInteractor songScanInteractor=new SongScanInteractor(mContext);
songs=songScanInteractor.scanSong();
subscriber.onNext(songs);
subscriber.onCompleted();
}
});
2、應當在Obserable中設定當Subscriber取消對Obserable的監聽之後,Obserable不再呼叫Subscriber的onNext()方法(即傳送訊息),如下有一段程式碼示意
private Observable<Integer> createObserver() {
return Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
if (!subscriber.isUnsubscribed()) {
for (int i = 0; i < 5; i++) {
int temp = new Random().nextInt(10);
if (temp > 8) {
//if value>8, we make an error
subscriber.onError(new Throwable("value >8"));
break;
} else {
subscriber.onNext(temp);
}
// on error,complete the job
if (i == 4) {
subscriber.onCompleted();
}
}
}
}
});
}
3、Obserable傳送的訊號阻塞了Subscriber的訊號處理,導致只有訊號傳送無資訊處理
現在發現Observable的一個特性,那就是Observable不間斷髮送訊號(這裡體現為手動呼叫onNext()),Subscriber的onNext()方法根本不會得到執行,因為來不及執行(我是這麼理解的),所以我們需要加上Thread.sleep(400);
這樣的程式碼減緩Obserable傳送請求的頻率。
同時我還發現,如果這個while(!subscriber.isUnsubscribed())
裡面的條件一直設為true,即寫成while(true)
,當你把繫結的subscriber解綁之後再與該Obserable繫結,Obserable的onNext()方法依然無法得到執行,與上述不加Thread.sleep(400);
的情況是一樣的,即沒有訊號處理,只有訊號傳送。
我的理解是,在解綁這段時間裡Obserable不斷髮出的訊號沒有處理一直被積壓,所以自然新加入的Subsciber自然沒有能力處理這些積壓的傳送訊號,所以癱瘓了···
Observable observable=Observable.create(new Observable.OnSubscribe<double[]>()
{
@Override
public void call(Subscriber<? super double[]> subscriber)
{
while(!subscriber.isUnsubscribed())
{
try
{
Thread.sleep(400);
} catch (InterruptedException e)
{
e.printStackTrace();
}
double[] doubles =new double[2];
doubles[0] = DeviceUtils.getDeviceWidth(mContext); //螢幕總長
doubles[1] =getMusicCurPos()/getDuration(); //歌曲播放比例
subscriber.onNext(doubles);
Log.d("PlayerProgress","onNext");
}
}
});
相關文章
- JavaScript Array Object的實際運用JavaScriptObject
- ItemDecoration深入解析與實戰(二)—— 實際運用
- Android adb命令的一些實際運用Android
- 說說 C# 9 新特性的實際運用C#
- websocket(推送服務)初始化及實際專案運用Web
- C++ 運算子全解析:從基礎概念到實際應用C++
- 【java】CountDownLatch運用場景(1)JavaCountDownLatch
- 關於MVP分層架構在專案中的實際運用MVP架構
- MySQL常見6個考題在實際工作中的運用MySql
- 拯救運維人!智慧運維如何實現1+1>2運維
- app實戰運用APP
- 棧的實際應用
- redis實際應用-限流Redis
- 在實際業務中如何靈活運用受控元件與非受控元件元件
- 如何運用TRIZ解決實際問題?這篇文章講的很清楚
- 運維工作實用技巧運維
- nodejs實際應用場景NodeJS
- 反向代理的實際應用
- 【docker專欄1】docker解決的實際問題及應用場景Docker
- 閉包實際場景應用
- Linux在實際中的應用Linux
- 動態代理的實際應用
- 實用的 Flutter 國際化指南Flutter
- Nginx Rewrite實際應用配置解析Nginx
- sklearn中的pipeline實際應用
- Canvas的實際應用場景1-生成一張主題分享圖片Canvas
- 網際網路運營者為什麼要會運用熱點思維?
- 數字化營銷在門店實際運用中到底有什麼本質作用?
- redux 原始碼解析與實際應用Redux原始碼
- 回車符號 ‘ ’ 的實際應用符號
- 【git實際應用填坑解決】Git
- TypeScript 隨想 · 實際應用與技巧TypeScript
- 觀察者模式的實際應用模式
- Drools決策表實踐運用
- 整合運放線性區運用的模擬實驗
- axios 二次封裝 api的統籌管理 配合async await實際專案中的運用iOS封裝APIAI
- 用一個實際例子理解Dockervolume工作原理Docker
- 使用者故事地圖實際應用地圖
- Oracle 定時任務job實際應用Oracle