RxJava2“ProtocolViolationException:Disposable has set!”

时间:2017-04-18 21:11:09

标签: android rx-java

我正在玩rxJava2并获得

io.reactivex.exceptions.ProtocolViolationException: Disposable already set!
尝试将内容添加到CompositeDisposable后

。运行应用程序后,我正在调用loadPost(),当我调用loadPostFromRemoteDataStore()时,应用程序崩溃。这是代码。

public class CountriesPresenterImpl extends MvpBasePresenter<CountriesView> implements CountriesPresenter {

@Inject AppRepository mAppRepository;

private final CompositeDisposable disposables = new CompositeDisposable();

private DisposableObserver observer = new DisposableObserver<List<Post>>() {

    @Override
    public void onNext(List<Post> posts) {
        getView().setData(posts);
        getView().showContent();
    }

    @Override
    public void onError(Throwable e) {
        getView().showError(e, false);
    }

    @Override
    public void onComplete() {

    }
};

@Override
public void attachView(CountriesView view) {
    super.attachView(view);
    App.getComponent().inject(this);
}

@Override
public void loadPost(boolean pullToRefresh) {
    disposables.add( mAppRepository.getPost()
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.newThread())
            .subscribeWith(observer) );
}

@Override
public void loadPostFromRemoteDatatore(boolean pullToRefresh) {
    disposables.add( new AppRemoteDataStore().getPost()
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.newThread())
            .subscribeWith(observer) );
}

@Override
public void detachView(boolean retainInstance) {
    super.detachView(retainInstance);
    if (!retainInstance) {
        disposables.clear();
    }
}

}

2 个答案:

答案 0 :(得分:2)

确定,

我得到了答案:

  
      
  • 与所有其他消费者一样,{@code DisposableCompletableObserver}只能订阅一次。

  •   
  • 任何后续尝试将其订阅到新来源都会产生
  •   
  • {@ link IllegalStateException},邮件为{@code&#34; Disposable已设置!&#34;}。
  •   

https://github.com/ReactiveX/RxJava/blob/fa58d36375ecc084b21bca299ca4780946b15dc5/src/main/java/io/reactivex/observers/DisposableCompletableObserver.java

每次使用subscribeWith时都创建了一个DisposableObserver。

答案 1 :(得分:1)

您不能使用相同的DisposableObservable实例订阅两个不同的observable。请参阅文档here