为啥 onSubscribe 在 rxjava 中不起作用?

Posted

技术标签:

【中文标题】为啥 onSubscribe 在 rxjava 中不起作用?【英文标题】:Why onSubscribe does not work in rxjava?为什么 onSubscribe 在 rxjava 中不起作用? 【发布时间】:2017-06-20 13:05:46 【问题描述】:

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

【问题讨论】:

当您将.observeOn(AndroidSchedulers.mainThread()) 更改为subscribeOn(它仍然崩溃)时,您传递给subscribeOn 调用的参数是什么? @theFunkyEngineer subscribeOn(AndroidSchedulers.mainThread()) 如果我没有 observeOn 它会崩溃 它崩溃了,因为我尝试在 UI 线程中更改某些内容 【参考方案1】:

正如medium artice中提到的:

一个重要的事实是 subscribeOn 不适用于主题。

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

检查这个medium artice

【讨论】:

以上是关于为啥 onSubscribe 在 rxjava 中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

RxJava操作符

RxJava Lift

RxJava源码浅析

RxJava源码浅析

RxJava源码浅析

RxJava中的Observable,在smartConfig中的应用