rxJava&rxAndroid-实际运用(1)

2016-12-01  本文已影响0人  ZzzRicardo_Yue

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

猜你喜欢

热点阅读