在以下活动中是否真的有必要使用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}}
答案 0 :(得分:4)
在调用onSaveInstanceState
后,您无法执行片段交易,因此,如果您的订阅打开DialogFragment
,那么在onDestroy
之前执行该操作,但在onSaveInstanceState
之后会使您的应用程序崩溃。如果活动正在关闭且网络请求完成且想要显示错误,则可能会发生这种情况。任何需要保存状态的东西都不能在onSaveInstanceState
出现问题后调用。