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

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

问题描述:

当我运行下面的代码时,如果我不写observeOn行,应用程序崩溃,因为getView().showBlockLayout(isBlock);调用试图隐藏或显示布局的方法。 但我试图改变observeOn(AndroidSchedulers.mainThread())以下至subscribeOn(AndroidSchedulers.mainThread())和应用程序崩溃!为什么onSubscribe在rxjava中不起作用?

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' 
+0

当您更改the'.observeOn(AndroidSchedulers.mainThread())''来subscribeOn'(和它仍然崩溃)是什么你传递到'subscribeOn'调用的参数? – theFunkyEngineer

+0

@theFunkyEngineer subscribeOn(AndroidSchedulers.mainThread())如果我没有observeOn它崩溃 –

+0

它崩溃,因为我试图改变UI线程中的东西 –

正如在这里提到的medium artice

一个重要的事实是订阅eOn不适用于主题。

所以你不能使用subscribeOn和科目,我们必须在订阅之前使用observerOn(AndroidSchedulers.mainThread())。 因此所有下游方法都在mainThread之后被调用。

检查这个medium artice