rxJava&rxAndroid-實際運用(1)

weixin_34293059發表於2016-12-01

整理自:
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");
                }
            }
        });

相關文章