为什么onSubscribe在rxjava中不起作用?

时间:2017-06-20 13:05:46

标签: java android rx-java behaviorsubject publishsubject

当我在代码下面运行时,如果我不写observeOn行,应用程序崩溃,因为getView().showBlockLayout(isBlock);调用一个试图隐藏或显示布局的方法。 但我尝试将observeOn(AndroidSchedulers.mainThread())更改为subscribeOn(AndroidSchedulers.mainThread()),然后应用再次崩溃!

subscription.add(UserStore.getInstance().getBlockObservable(databaseHelper.getConference().getUserChatId())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<Boolean>() {
                @Override
                public void call(Boolean isBlock) {
                    getView().showBlockLayout(isBlock);
                    databaseHelper.getConference().setBlock(isBlock);
                    mConferenceModel.setBlock(isBlock);
                }
            }));

我也测试了这个:

subscription.add(UserStore.getInstance().getBlockObservable(databaseHelper.getConference().getUserChatId())
            .subscribeOn(Schedulers.computation())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<Boolean>() {
                @Override
                public void call(Boolean isBlock) {
                    getView().showBlockLayout(isBlock);
                    databaseHelper.getConference().setBlock(isBlock);
                    mConferenceModel.setBlock(isBlock);
                }
            }));

并且意外地起作用并且没有崩溃!我没有在getBlockObservable方法中使用subscribeOn(因为我知道我们可以设置一次)

这是我的UserStore班级

PublishSubject<Pair<String,Boolean>> mObservableBlock;

private UserStore(){
    mObservableBlock = PublishSubject.create();
    mInstance = this;
}

public static UserStore getInstance() {
    if(mInstance == null)
        new UserStore();
    return mInstance;
}

public Observable<Boolean> getBlockObservable(final String userId){
    return mObservableBlock
            .observeOn(Schedulers.computation())
            .filter(new Func1<Pair<String,Boolean>, Boolean>() {
        @Override
        public Boolean call(Pair<String,Boolean> s) {
            if(userId.equals(s.first))
                return true;
            return false;
        }
    }).map(new Func1< Pair<String, Boolean>, Boolean>() {

        @Override
        public Boolean call(Pair<String, Boolean> UserBlock) {
            return UserBlock.second;
        }
    });
}
public void publishBlockedUser(String userId,boolean isBlock){
    mObservableBlock.onNext(new Pair<String, Boolean>(userId,isBlock));
}

以下是我在gradle中导入rxjava依赖的方法

compile 'io.reactivex:rxjava:1.1.5'
compile 'io.reactivex:rxandroid:1.2.0'

1 个答案:

答案 0 :(得分:1)

如此medium artice中所述:

  

一个重要的事实是subscribeOn不能与Subjects一起使用。

因此,您不能将subscribeOn用于主题,我们必须在订阅之前使用observerOn(AndroidSchedulers.mainThread())。 因此,之后所有下游方法都会在mainThread上调用。

检查此medium artice