RxAndroid,一段簡單的代碼

 先看如下一段代碼:

public class RxAndroidTest {
    private static final String TAG = "RxAndroidTest";

    public static void test() {
        final AtomicBoolean flag = new AtomicBoolean(true);

        final int[] array = { 1, 3, 5, 7, 9 };
        final Disposable disposable = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> e) {
                for (int i : array) {
                    if (!flag.get())
                        break;
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e1) {
                        //
                    }
                    e.onNext(String.valueOf(i));
                    Log.d(TAG, "subscribe " + i);
                }
                // 通知操作結束
                e.onComplete();
            }
        }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) {
                        Log.d(TAG, s);
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) {
                        Log.d(TAG, "onError");
                    }
                }, new Action() {
                    @Override
                    public void run() {
                        // 若不指定observeOn,則與observable在同一線程
                        Log.d(TAG, "onComplete");
                    }
                });

        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                // 調用dispose後,observable.subscribe仍然會執行
                // 但是observer不會執行onNext或onError或onComplete
                disposable.dispose();
                // 停止observable執行
                flag.set(false);
            }
        }, 3000);
    }

}

分析:

1,Observable的常用構造可以使用Observable.create或Observable.fromCallable。 

2,subscribeon指定Observable執行線程,一般指定Schedulers.io()即可,內部會使用線程池執行任務。observeon指定Observer運行線程,AndroidSchedulers.mainThread()表示安卓UI線程。

3,subscribe可以指定多個參數,分別關注onNext,onComplete,onError。

4,ObservableOnSubscribe.subscribe中,e.onNext後會觸發Consumer.accept,e.onComplete會觸發Action.run。

5,Observable返回的Disposable.dispose後,那麼,從Observable到Observer之間的連接中斷,Observable仍舊會運行,但Observer得不到結果。

6,爲了停止Observable,可以使用AtomicBoolean標記,在Observable內部運行時檢測標記,從而推出循環。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章