假设我有
Disposable disposable = signOutUser()
.subscribe((Response<ResponseBody> response) -> {
if (response.isSuccessful()) {
Intent intent = new Intent(view.getContext(), SignInUserActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY);
view.getContext().startActivity(intent);
((FragmentActivity) view.getContext()).finish();
}
}, (Throwable ex) -> {
Log.e(TAG, "signOutUser: " + ex.getMessage());
});
其中signOutUser()
返回Single<Response<ResponseBody>>
。当signOutUser()
成功时,有一个Intent,当前活动已完成()。否则,它可能由于网络错误而失败,因此没有意图并且用户保持当前活动。
由于这不是要观察的事情(它是一次性事件,成功或失败),如果用户成功注销,则会调用onDestroy
调用{{1}这清除所有一次性用品。因此,我添加compositeDisposable.clear()
并立即处理或清除Disposable
。
我的问题是,我是否需要使用Composite Disposable?我会在Disposable
之后立即致电disposable.dispose()
吗?我是否将任何内容设置为subscribe
?我不使用null
吗?
答案 0 :(得分:4)
我是否需要使用Composite Disposable?
是的,您应该始终使用复合一次性(或正常的一次性使用),并在时间到来时取消订阅(onDestroy / onStop您需要的任何地方)。原因是网络调用可能在您关闭活动后完成,这将导致内存泄漏甚至崩溃(因为上下文将为null)。
订阅后我是否立即调用一次dop.dispose()?
不,因为这会导致调用永远不会返回结果。如果您在致电订阅后立即处置,您将永远不会得到它的回复。了解处置可观察物后会发生什么。
我将任何内容设为null吗?
没必要。如果你的单身已经完成,你不需要做任何事情。并且它仍然存在于CompositeDisposable中(即使你在上面调用dispose)也没有任何问题。实际上,在Single完成之后,RxJava会将observable本身处置为安全的一些内存。
我不使用Single吗?
是的,这是使用它的完美情况。您想要执行单个请求,无需使用Observable。
答案 1 :(得分:0)
是的,你应该使用一次性用品。考虑从API调用收到响应的情况,但上下文因任何原因而消失。然后,您获取上下文和调用方法的所有代码都将导致NPE。妥善处理这个单一将帮助您避免这种崩溃。