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
- 把JBPM運用到實際專案中(1)
- ItemDecoration深入解析與實戰(二)—— 實際運用
- 淺談專案管理在電廠實際運營管理的應用(1)(轉)專案管理
- MVVM+RAC實際專案中的運用MVVM
- 說說 C# 9 新特性的實際運用C#
- Android adb命令的一些實際運用Android
- websocket(推送服務)初始化及實際專案運用Web
- C++ 運算子全解析:從基礎概念到實際應用C++
- 【java】CountDownLatch運用場景(1)JavaCountDownLatch
- 拯救運維人!智慧運維如何實現1+1>2運維
- MySQL常見6個考題在實際工作中的運用MySql
- 關於MVP分層架構在專案中的實際運用MVP架構
- 在實際業務中如何靈活運用受控元件與非受控元件元件
- 如何運用TRIZ解決實際問題?這篇文章講的很清楚
- 實用的位運算應用
- 運維工作實用技巧運維
- redis實際應用-限流Redis
- 淺談專案管理在電廠實際運營管理的應用(2)(轉)專案管理
- Redis 運維實際經驗紀錄之一Redis運維
- 21實際c語言教程-1 (轉)C語言
- 反向代理的實際應用
- Redis實際應用場景Redis
- 遠離紙上談兵!尼爾森可用性原則的實際運用!
- SSH原理與運用(1):遠端登入
- 【docker專欄1】docker解決的實際問題及應用場景Docker
- 網際網路運營者為什麼要會運用熱點思維?
- Canvas的實際應用場景1-生成一張主題分享圖片Canvas
- 動態代理的實際應用
- 實用的 Flutter 國際化指南Flutter
- 觀察者模式的實際應用模式
- Nginx Rewrite實際應用配置解析Nginx
- 閉包實際場景應用
- DATAGUARD實際的應用場景
- oracle臨時表實際應用Oracle
- java 單例的實際應用Java單例
- Jini - Java 的實際應用 (轉)Java
- Vim 實用技術,第 1 部分: 實用技巧