如果我的RxJava 2调用返回Single或Maybe,我还需要使用CompositeDisposable吗?

时间:2018-01-26 23:41:34

标签: android rx-java observable reactive-programming rx-java2

假设我有

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吗?

2 个答案:

答案 0 :(得分:4)

  

我是否需要使用Composite Disposable?

是的,您应该始终使用复合一次性(或正常的一次性使用),并在时间到来时取消订阅(onDestroy / onStop您需要的任何地方)。原因是网络调用可能在您关闭活动后完成,这将导致内存泄漏甚至崩溃(因为上下文将为null)。

  

订阅后我是否立即调用一次dop.dispose()?

不,因为这会导致调用永远不会返回结果。如果您在致电订阅后立即处置,您将永远不会得到它的回复。了解处置可观察物后会发生什么。

  

我将任何内容设为null吗?

没必要。如果你的单身已经完成,你不需要做任何事情。并且它仍然存在于CompositeDisposable中(即使你在上面调用dispose)也没有任何问题。实际上,在Single完成之后,RxJava会将observable本身处置为安全的一些内存。

  

我不使用Single吗?

是的,这是使用它的完美情况。您想要执行单个请求,无需使用Observable。

答案 1 :(得分:0)

是的,你应该使用一次性用品。考虑从API调用收到响应的情况,但上下文因任何原因而消失。然后,您获取上下文和调用方法的所有代码都将导致NPE。妥善处理这个单一将帮助您避免这种崩溃。