如果使用subscribeOn()而不是observeOn(),则RxRelay不会发出onNext

时间:2018-06-15 10:51:57

标签: android rx-java rx-java2 rx-android

以下是我的活动代码。

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import com.jakewharton.rxrelay2.PublishRelay;
import com.jakewharton.rxrelay2.Relay;
import io.reactivex.Scheduler;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.schedulers.Schedulers;

public class MyActivity extends AppCompatActivity {

    private final String TAG = "MYTAG";

    private CompositeDisposable disposable = new CompositeDisposable();

    private Relay<Integer> integerRelay = PublishRelay.create();
    private Relay<String> stringRelay   = PublishRelay.create();
    private Relay<Long> longRelay       = PublishRelay.create();

    private Scheduler mainThread = AndroidSchedulers.mainThread();
    private Scheduler ioThread   = Schedulers.io();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lesson_selection);

        bindInteger();
        bindString();
        bindLong();

        integerRelay.accept(1);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        disposable.clear();
    }

    private void bindInteger() {
        disposable.add(integerRelay
                .subscribeOn(mainThread)
                .subscribe(it -> {
                    Log.d(TAG, "onNext integer [ " + it + " ]");

                    stringRelay.accept("1s");
                    stringRelay.accept("2s");
                    stringRelay.accept("3s");
                    stringRelay.accept("4s");
                    stringRelay.accept("5s");

                    longRelay.accept(1000L);
                })
        );
    }

    private void bindString() {
        disposable.add(stringRelay
                .subscribeOn(mainThread)
                .subscribe(it -> {
                    Log.d(TAG, "onNext String [ " + it + " ]");
                })
        );
    }

    private void bindLong() {
        disposable.add(longRelay
                .subscribeOn(mainThread)
                .subscribe(it -> {
                    Log.d(TAG, "onNext long [ " + it + " ]");
                })
        );
    }

}

正如你所看到的,在onCreate()方法中,首先我订阅了所有的继电器。 (integerRelay,stringRelay,longRelay)

然后,在onCreate()方法的最后,我接受了一个整数值 1

根据代码,在此活动启动后,我预计stringRelay的所有字符串值和longRealy的长值将被发送到onNext方法,因为我提前订阅了所有的中继。

但是,在bindInteger()内部,integerRealy的onNext()方法不会被调用。其他人也一样。

即使我按下设备上的取消按钮并重新进入此活动,也没有运气。

我在这里发现了另外一件事。如果我将所有 subscribeOn(mainThread) 更改为 observeOn(ioThread) 。看起来工作得很好。

对于这种情况发生的原因有什么解释吗?

任何帮助,任何文件,任何链接将不胜感激!

0 个答案:

没有答案