gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:29:45 25 4
gpt4 key购买 nike

如果我不写 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'

最佳答案

如本medium artice所述:

One important fact is that subscribeOn does not work with Subjects.

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

检查这个medium artice

关于java - 为什么 onSubscribe 在 rxjava 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44653912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com