Android 使用RxJava--基礎篇

RxJava是什麼

RxJava 是基於觀察者模式寫成的一套框架。具備快捷切換線程的能力。

RxJava可以做什麼?

可以在指定線程去做業務處理,然後把處理結果返回到指定的另一個線程。

RxJava 怎麼使用?

引入依賴庫:

    implementation 'io.reactivex.rxjava3:rxjava:3.0.0'
    implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'

創建Observable

方法1:一般來說,比較常用的創建方法:

        Observable.create(new ObservableOnSubscribe<String>() {
        	此處的subscribe方法主要用於你去處理業務邏輯,處理完之後調用emitter.onNext 把結果發送給監聽者。
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Throwable {
                emitter.onNext("Observable.create");
            }
        }).subscribe(new Consumer<String>() {
        此處的accept方法主要用於接收到結果之後,你要做的業務邏輯
            @Override
            public void accept(String s) throws Throwable {
                Log.d(TAG, s);
            }
        });

方法2:快捷的創建方法,從數組裏面創建

        Observable.fromArray(Arrays.asList(1,2,34,5)).subscribe(new Consumer<List<Integer>>() {
            @Override
            public void accept(List<Integer> integers) throws Throwable {
                Log.d(TAG, "integers:" + integers);
            }
        });

方法3:使用可變參數創建


        Observable.just("just1", "just2").delay(3, TimeUnit.SECONDS).subscribeWith(new Observer<String>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {

            }

            @Override
            public void onNext(@NonNull String s) {

                Log.d(TAG, s);
            }

            @Override
            public void onError(@NonNull Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        }).onSubscribe(new Disposable() {
            @Override
            public void dispose() {

            }

            @Override
            public boolean isDisposed() {
                return false;
            }
        });

指定線程

我們可以執行業務處理操作的線程,以及結果回調的線程。
比如在Android 裏面,我們希望數據處理在子線程,更新Ui在主線程,那麼我們可以這樣做。

bservable.just("one", "two").subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())

subscribeOn 表示訂閱在哪個線程,我們寫的業務處理代碼就會在哪個線程。
observeOn 表示通知在哪個線程,處理結果完成後,會在指定的線程通知我們。
注意:如果你只是指定了subscribeOn 線程,沒有指定observeOn 線程,那麼默認RxJava 就會在你ObserveOn 的線程,直接回調結果給你。

取消操作

如果我們想要在業務處理過程中取消訂閱,也是很簡單的。
我們調用subscribe方法之後,會返回一個Disposable,我們調用dispose方法就可以取消訂閱,就不會收到通知了。

        @NonNull Disposable subscribe1 = Observable.just("1,2,3", "4,5,6").subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Throwable {
                Log.d(TAG, "subscribe1" + s);
            }
        });
        //雖然這個取消了 但是已經執行了 所以取消沒有什麼用了
        subscribe1.dispose();

注意,上面這樣寫,dispose 方法雖然調用了,但是沒有什麼用,你會發現 accept() 方法還是會調用。是因爲subscribe 方法就會執行你的業務處理邏輯的代碼,比如上面的業務沒有在子線程去執行,通知也沒有在子線程通知,都是在當前線程,那麼他就會走完accept方法之後,才能走到dispose方法。所以dispose方法就無效果。

下面的是有效果的:

        @NonNull Disposable subscribe1 = Observable.just("1,2,3", "4,5,6")
                .subscribeOn(Schedulers.io())
                .subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Throwable {
                Log.d(TAG, "subscribe1" + s);
            }
        });
        subscribe1.dispose();

延遲執行

Observable.just("cao", "xin", "yu").delay(2, TimeUnit.SECONDS);

表示這個業務會延遲兩秒去執行

定期做一件事情

        Observable.interval(5,5,TimeUnit.SECONDS).subscribe(new Consumer<Long>() {
            @Override
            public void accept(Long aLong) throws Throwable {
                Log.d(TAG, "aLong:" + aLong);
            }
        });

上面的用法表示,5S 後,每5S執行一次accept 方法。

基本上這樣就是RxJava 的使用,RxJava 的功能不止這些,有些如果需要可以自行深入瞭解。

RxJava幾個關鍵類 UML 後續

參考鏈接:
RxJava Wiki鏈接

有一個wiki 鏈接,可以明白的查看到結果。

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