当前位置:  开发笔记 > 编程语言 > 正文

我是否必须取消订阅已完成的观察?

如何解决《我是否必须取消订阅已完成的观察?》经验,为你挑选了2个好方法。

如果一个observable完成了,我是否还必须取消订阅/处置(在RxJava2中)observable以删除Observer(防止内存泄漏),或者一旦发生onCompleteonError事件发生,这是由RxJava内部处理的吗?

对其他类型的像什么Single,Completable,Flowable等.



1> 小智..:

是的,你是对的.

流终止后(已调用onComplete/onError),订阅者自动取消订阅.您应该能够使用isUnsubscribed()Subscription对象上的方法测试这些行为.



2> David Rawson..:

虽然您不需要手动取消订阅已终止的流,但如果您不小心,仍可以使用RxJava2创建内存泄漏.

请考虑以下代码:

repository.getData()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(data -> myTextView.setText(data.toString()));

subscribe中的lambda参数是匿名内部类的"syntatic sugar":

subscribe(new Consumer() {
    @Override
    public void accept(final Data data) {
        myTextView.setText(data.toString());
    }
});

在JVM上,匿名内部类维护对外部类的引用.

假设对于上述天真代码,外部类是一个Activity(这也适用于Fragment,Service,BroadcastReceiver或其生命周期由Android OS控制的任何类).

活动订阅了观察者,但是在内存不足的情况下被Android操作系统销毁(你可以通过打开开发者选项/不要保持活动来模仿这种效果).如果在Schedulers.io()销毁Activity时仍在运行,则仍将通过匿名内部类向Activity维护引用.这意味着内存泄漏会阻止垃圾收集器完成活动.如果Activity有多个Views或比如Bitmap对象,那么内存泄漏可能非常大.

这里有许多解决方案,但其中一个是维护一个CompositeDisposable对象并onDestroy()在Android Activity 的生命周期方法中清除它:

public class MyActivity extends Activity {

   DataRepository dataRepository;
   CompositeDisposable disposables;

   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       disposables = new CompositeDisposable();
   }

   public void onButtonClick(View v) {
       repository.getData()             
          .subscribeOn(Schedulers.io())
          .observeOn(AndroidSchedulers.mainThread())
          .doOnSubscribe(disposable -> disposables.add(disposable))
          .subscribe(data -> myTextView.setText(data.toString()));
   }

   @Override
   public void onDestroy() {
       disposables.clear();
       super.onDestroy();
   }
}

您可以参考一个很好的示例,了解如何在官方Google Android架构蓝图中的Android应用中使用RxJava .


在您的泄漏活动示例中,一旦I / O竞争,它仍然可以完成,对吗?因此,与其说是永久性泄漏,不如说是延迟定稿。
推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有