2017-06-20 20 views
1

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); 
       } 
      })); 

をし、予想外にそれが働いたとクラッシュしませんでした!

は、それは私がGradleの中rxjava依存性をインポートする方法私の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)); 
} 

だとここにある(私たちは、一度それを設定することができます知っているので)私はgetBlockObservable方法でsubscribeOnを使用していませんでした

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

@theFunkyEngineer subscribeOn(AndroidSchedulers.mainThread())私がobserveOnを持っていないとクラッシュする –

+0

UIスレッドで何かを変更しようとするとクラッシュする –

答えて

1

medium artice

1つの重要な事実は、サブスクライブeOnは科目では動作しません。

サブ科目でsubscribeOnを使用することはできません。サブスクリプションの前にobserverOn(AndroidSchedulers.mainThread())を使用する必要があります。 それ以降、すべてのダウンストリームメソッドがmainThreadで呼び出されます。あなたは `subscribeOn`呼び出しに渡している引数が何であるかを` subscribeOn`(と、それはまだクラッシュ)にthe`.observeOn(AndroidSchedulers.mainThreadを()) `変更

チェックこのmedium artice

関連する問題