美文网首页rxjavaAndroid架构文章
在mvp中使用rxlifecycle避免rxjava的内存泄漏

在mvp中使用rxlifecycle避免rxjava的内存泄漏

作者: jsync | 来源:发表于2017-05-17 13:46 被阅读4250次

问题

在使用rxjava的时候,如果不及时解除订阅,当退出acitivy的时候,异步线程还在执行,对activity还存在引用,此时就会产生内存泄漏。

解决

使用第三方的rxlifecycle能够很方便的解决这个问题。他可以让Observable发布的事件和当前的组件绑定,实现生命周期同步。从而实现当前组件生命周期结束时,自动取消对Observable订阅。
参考blog
废话说了一大堆,本文主要介绍在mvp中使用rxlifecycle

添加依赖

//处理rxjava内存泄漏 compile 'com.trello.rxlifecycle2:rxlifecycle:2.0.1' // compile 'com.trello.rxlifecycle2:rxlifecycle-android:2.0.1' compile 'com.trello.rxlifecycle2:rxlifecycle-components:2.0.1'

建立BaseActivity

将自己的BaseActivity继承RxAppCompatActivity,或者你自己构建一个RxActivity也可以,看一下RxAppCompatActivity源码即可。

public abstract class RxAppCompatActivity extends AppCompatActivity implements LifecycleProvider<ActivityEvent> {
private final BehaviorSubject<ActivityEvent> lifecycleSubject = BehaviorSubject.create();
@Override
@NonNull
@CheckResult
public final Observable<ActivityEvent> lifecycle() {
    return lifecycleSubject.hide();
}
@Override
@NonNull
@CheckResult
public final <T> LifecycleTransformer<T> bindUntilEvent(@NonNull ActivityEvent event) {
    return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
}
@Override
@NonNull
@CheckResult
public final <T> LifecycleTransformer<T> bindToLifecycle() {
    return RxLifecycleAndroid.bindActivity(lifecycleSubject);
}
@Override
@CallSuper
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    lifecycleSubject.onNext(ActivityEvent.CREATE);
}
@Override
@CallSuper
protected void onStart() {
    super.onStart();
    lifecycleSubject.onNext(ActivityEvent.START);
}
@Override
@CallSuper
protected void onResume() {
    super.onResume();
    lifecycleSubject.onNext(ActivityEvent.RESUME);
}
@Override
@CallSuper
protected void onPause() {
    lifecycleSubject.onNext(ActivityEvent.PAUSE);
    super.onPause();
}
@Override
@CallSuper
protected void onStop() {
    lifecycleSubject.onNext(ActivityEvent.STOP);
    super.onStop();
}
@Override
@CallSuper
protected void onDestroy() {
    lifecycleSubject.onNext(ActivityEvent.DESTROY);
    super.onDestroy();
}}

接口

interface Iview{ LifecycleTransformer bindLifecycle(); }

Activity中实现Iview接口的bindLifecycle()方法

@Override public LifecycleTransformer bindLifecycle() { //RxAppCompatActivity中的方法bindToLifecycle() LifecycleTransformer objectLifecycleTransformer = bindToLifecycle(); return objectLifecycleTransformer; }

presenter中使用

关键代码.compose(iview.bindLifecycle())
用的mvp模式,网络请求用的rxjava加retrofite。mvp和网络框架这里就不介绍了,网上有很多。
其中iview是activity传过来的接口,这里或者是activity的弱引用对象等等,反正就是用来调用activity中的方法,联系activity与presenter的。换成你自己的就行了。
参考blog

RxRetrofitFactory.create(MyService.class).getRecords("自己网络请求的参数")
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .compose(iview.bindLifecycle())
            .subscribe(new Observer<Message<List<ResultBean>>>() {
                @Override
                public void onSubscribe(Disposable d) {
                    Log.e("onSubscribe","onSubscribe--------------------------------------");
                    //d.dispose();//解除订阅(在这里解除订阅,后面的都不会执行了)
                }
                @Override
                public void onNext(Message<List<ResultBean>> records) {
                    Log.e("onNext","onNext--------------------------------------");
                    List<ResultBean> recordList=records.Result;
                    iview.addRecordToList(recordList);
                }
                @Override
                public void onError(Throwable e) {
                    Log.e("onError","onError--------------------------------------");
                    iview.showLoading(false);
                }
                @Override
                public void onComplete() {
                    Log.e("onComplete","onComplete,--------------------------------------");
                    iview.showLoading(false);
                }
            });

`

遗留问题

rxjava2.0的observer中的onSubscribe(Disposable d)方法到底怎么用的不是很清楚,在里面解除订阅后,怎么后面的onNext方法就不执行了。希望大神能帮帮我,感激不尽!

相关文章

网友评论

  • 三台东:楼主 我使用同样的方式 为啥没有取消订阅呢
    jsync:@三台诗人 你用v.bindToLifecycle试试
    三台东:我是订阅的是一个DisposableObserver 实现了里面的 next error 以及oncomplete方法 我也加上了compose(v.lifecycle) 我activity里面对应的方法调的是bindUntilEvent(ActivityEvent.PAUSE)方法 但是当我界面消失的时候,打印log oncomplete方法仍然走了
    jsync:能说下你的具体操作吗?我这边用着是可以的啊
  • GOAD:dispose后走的complete吧
    jsync:dispose后不会再走了,虽然上行还是会继续发送事件,但是下行就罢工了,可以打log看日志,这里可以参考https://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650823932&idx=1&sn=198b18f2f9359e2eee1ffc8703d31905&chksm=80b78862b7c001741916c681d070ca3c1a58eef5632ea394797029d0335f312816afecf87e7d&mpshare=1&scene=23&srcid=09114JAEJHKVbaM6gIo6tAyB&client=tim&ADUIN=1831787315&ADSESSION=1517189705&ADTAG=CLIENT.QQ.5537_.0&ADPUBNO=26763#rd
  • Super_l1:感谢无私奉献
  • loopq:针对最后你的遗留问题,给你解答,我不是大神,都是从别人的文章里看到的。
    1.onSubscribe里的Disposable用法很多,等会我给你留一个链接。
    2.当你调用了d.dispose()方法之后onNext方法不执行了的原因解释为一句话:“注意: 调用dispose()并不会导致上游不再继续发送事件, 上游会继续发送剩余的事件.但是导致下游收不到事件.”
    3.RxJava链接:http://www.jianshu.com/p/464fa025229e,这是一整个教程,你可以看看
    jsync:@daisy123 感谢!

本文标题:在mvp中使用rxlifecycle避免rxjava的内存泄漏

本文链接:https://www.haomeiwen.com/subject/zjqdxxtx.html