RxAndroid:什么时候使用bindActivity?为什么?

时间:2014-10-13 16:27:19

标签: android rx-java

在以下活动中是否真的有必要使用AndroidObservable.bindActivity(...)?因为您仍然需要在onDestroy中手动取消订阅。

根据this blog帖子,bindActivity是必要的:

  

你没有意识到在有效的情况下改变状态

- 我读它的方式 - 意味着在调用finish()之后对活动执行某些操作时会出现问题,因此在onDestroy中取消订阅会太晚。

有人能举例说明,在onDestroy中取消订阅的时间实际上是一个问题吗?


如果查看AndroidObservable.java private static final Func1<Activity, Boolean> ACTIVITY_VALIDATOR = new Func1<Activity, Boolean>() { @Override public Boolean call(Activity activity) { return !activity.isFinishing(); } }; {bind},那么用于bindActivity的谓词函数是:

private static final Func1<Activity, Boolean> ACTIVITY_VALIDATOR = new Func1<Activity, Boolean>() {
@Override public Boolean call(Activity activity) {
        return !activity.isFinishing() && !activity.isChangingConfigurations();
    }
};  

最好还检查配置更改,例如:

public class SomeActivity extends Activity implements Observer<String> {
    private Subscription subscription;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        subscription = getObservable().observeOn(AndroidSchedulers.mainThread()).subscribe(this);

        // or use bindActivity here????
        // subscription = AndroidObservable.bindActivity(this, getObservable()).subscribe(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        subscription.unsubscribe();
    }

    @Override
    public void onNext(String s) {
        // do something with the activity state...
    }

    @Override public void onCompleted() {}
    @Override public void onError(Throwable throwable) {}
}

???


SomeActivity.java

{{1}}

1 个答案:

答案 0 :(得分:4)

在调用onSaveInstanceState后,您无法执行片段交易,因此,如果您的订阅打开DialogFragment,那么在onDestroy之前执行该操作,但在onSaveInstanceState之后会使您的应用程序崩溃。如果活动正在关闭且网络请求完成且想要显示错误,则可能会发生这种情况。任何需要保存状态的东西都不能在onSaveInstanceState出现问题后调用。