【问题标题】:Observable is not subscribed after return from next activity从下一个活动返回后未订阅 Observable
【发布时间】:2017-12-31 17:58:08
【问题描述】:

我在 onActivityCreated 的片段中有 CompositeSubscription。在我更改 EditText 中的字符串后,我在 mViewModel 中的代码会发出 Observable。

    mSubscription = new CompositeSubscription();
    mSubscription.add(mViewModel.getMyObservableIdModelCompany()
            .observeOn(rx.android.schedulers.AndroidSchedulers.mainThread())
            .doOnError(throwable -> { Log.e(TAG, "Error NewCashDocFragment " + throwable.getMessage());
                hideProgressBar();
                Toast.makeText(getActivity(), "Server not connected", Toast.LENGTH_SHORT).show();
            })
            .onErrorResumeNext(throwable -> empty())
            .subscribe(this::setIdCompanyKt));

我的 mViewModel 中的方法

public Observable<List<IdCompanyKt>> getMyObservableIdModelCompany() {

    return mObservableIdModelCompany
            .observeOn(mSchedulerProvider.computation())
            .flatMap(queryx -> mDataModel.getObservableIdModelCompany());
}

完整片段代码链接https://github.com/eurosecom/samfantozzi/blob/masterAS3/app/src/main/java/com/eusecom/samfantozzi/NewCashDocFragment.java

如果我启动 Activityfragment,代码可以正常工作并且我订阅了 Observable。如果我启动 startActivityForResult 下一个 Activity 并返回到 Activityfragment 我无法订阅 Observable。

返回后我的 Observable 似乎在另一个线程上。

为什么下一个Activity返回后不能订阅Observable?

【问题讨论】:

  • 再贴一些代码,第一个sn-p是从哪里调用的?以及如何清除 CompositeSubscription
  • @elmorabea first sn-p 在片段的 onActivityCreated 方法中被调用。似乎返回后我的 Observable 在其他线程上。
  • onDestroy 中调用clear(),而不是unsubscribe/dispose

标签: android rx-java2 rx-android


【解决方案1】:

我已将创建和订阅 Observable 从方法 onActivityCreated 移动到方法 onResume 并将取消订阅 Observable 到方法 onPause。每次从下一个活动返回时,Observable 都会重新初始化。

@Override
public void onResume() {
    super.onResume();
    bind();
    mSubscription = new CompositeSubscription();
    mSubscription.add(mViewModel.getMyObservableIdModelCompany()
            .subscribeOn(Schedulers.computation())
            .observeOn(rx.android.schedulers.AndroidSchedulers.mainThread())
            .doOnError(throwable -> { Log.e(TAG, "Error NewCashDocFragment " + throwable.getMessage());
                hideProgressBar();
                Toast.makeText(getActivity(), "Server not connected", Toast.LENGTH_SHORT).show();
            })
            .onErrorResumeNext(throwable -> empty())
            .subscribe(this::setIdCompanyKt));
}

【讨论】:

    猜你喜欢
    • 2018-11-23
    • 1970-01-01
    • 2017-02-17
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 2018-04-02
    相关资源
    最近更新 更多