解决rxjava导致的内存泄漏

原创 2016年05月31日 22:57:10

版权声明:本文为博主原创文章,未经博主允许不得转载。

1.使用取消订阅管理器:CompositeSubscription,让CompositeSubscription持有所有的请求。统一取消。

//这代码是mvp中使用的 
public class LoginPresenter implements BasePresenter{
    private UserLoginContract mView;//当前的页面
    private CompositeSubscription msubscription;//管理所有的订阅

    public LoginPresenter(UserLoginContract mView) {
        this.mView = mView;
        this.mView.setPresenter(this);
        this.msubscription = new CompositeSubscription();

    }


    /**
     * 获取class
     */
    public void getClassInfo() {
        HashMap<String, String> map = new HashMap<>();
        map.put("id", "3");
        Subscription i  = ApiManger.getIntance().api.getClass(map)
                .flatMap(new Func1<BaseBean<List<SchoolClass>>, Observable<List<SchoolClass>>>() {
                    @Override
                    public Observable<List<SchoolClass>> call(BaseBean<List<SchoolClass>> listBaseBean) {
                        return new ApiInterceptor().flatResult(listBaseBean);
                    }
                })
                .compose(RxSchedulers.<List<SchoolClass>>IO_Main())
                .subscribe(new Subscriber<List<SchoolClass>>() {
                    @Override
                    public void onCompleted() {
                        //获取数据完成
                        mView.loginSuccess();
                    }

                    @Override
                    public void onError(Throwable e) {
                       ApiException apiException = (ApiException) e;
                        mView.showToast(apiException.getRespMSg());
                    }

                    @Override
                    public void onNext(List<SchoolClass> schoolClasses) {
                        //得到数据,在页面可以进行数据绑定操作
                    }
                });
        this.msubscription.add(i);//把订阅加入管理集合中
    }

    @Override
    public void onDestroy() {
        //在activity结束生命周期的时候取消订阅,解除对context的引用
        if(msubscription != null){
            this.msubscription.unsubscribe();
        }
    }
}


public class BaseActivity extends AppCompatActivity {
    public BasePresenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        presenter.onDestroy();
    }
}

2.使用Rxlifecycle第三方库,完成Observable发布的事件和当前的组件绑定,实现生命周期同步。组件生命周期结束时,自动取消对Observable订阅。

项目依赖:

//rxlifecycle 生命周期同步
    compile 'com.trello:rxlifecycle:0.6.1'
    compile 'com.trello:rxlifecycle-components:0.6.1'

Rxlifecycle 使用

Activity/Fragment需继承RxAppCompatActivity/RxFragment,目前支持的有RxAppCompatActivity、RxFragment、RxDialogFragment、RxFragmentActivity。

一、bindToLifecycle()方法

在子类使用Observable中的compose操作符,调用,完成Observable发布的事件和当前的组件绑定,实现生命周期同步。从而实现当前组件生命周期结束时,自动取消对Observable订阅。

   Observable.interval(1, TimeUnit.SECONDS)
        .compose(this.bindToLifecycle())
            .subscribe(new Action1<Long>() { 
                @Override
                public void call(Long num) {
                    Log.i(TAG, "  " +num);
                }
            });

二、bindUntilEvent() 方法

使用ActivityEvent类,其中的CREATE、START、 RESUME、PAUSE、STOP、 DESTROY分别对应生命周期内的方法。使用bindUntilEvent指定在哪个生命周期方法调用时取消订阅。

 Observable.interval(1, TimeUnit.SECONDS)
         .compose(this.bindUntilEvent(ActivityEvent.PAUSE))  
         .subscribe(mSub);

3.自己取消订阅:subscription.unsubscribe() ;

public abstract class BaseFragment extends Fragment {
    protected Subscription subscription;

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        unsubscribe();
    }

    protected void unsubscribe() {
        if (subscription != null && !subscription.isUnsubscribed()) {
            subscription.unsubscribe();
        }
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android rxjava内存泄漏问题

虽然rxjava很好用, 如果产生过多的订阅就会造成内存泄漏问题, 如何解决呢?@Override protected void onDestroy() { super.onD...

实战自动化测试Espresso和Ui automator(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。这篇文章,是接着 实战自动化测试Espresso和Ui automator(一)来进行记录的,由于时间的限制,和阅读的习惯,我不喜欢,把一篇文章,写...

RxJava在Android中内存泄漏解决以及RxJava的封装。

RxJava在现在是一个非常前卫的异步框架,也是由于他非常新,所以比较难以驾驭。 像okhttp直接在onStop或者onDestroy 调用它的cancel方法就行了,但是Rxjava并没有那么简...

RxJava(十二)combineLatest操作符的高级使用

combineLatest 操作符用来将多个Observable发射的数据组装起来然后在发射. 通过Func类来组装多个Observable发射的数据, 等到最后一个Observable发射数据了, ...

RxJava 从入门到出轨

RxJava:https://github.com/ReactiveX/RxJava 前言 RxJava 概念初步理解 作用 - 异步 模式 - 观察者模式 结构 - 响应式编程 优势 - 逻辑简洁 ...

记Retrofit 2的请求与数据直转

版权声明:本文为博主原创文章,未经博主允许不得转载。前几天,我们又开始在做一个新项目,由于是一个外包项目,后台是一群php,这出现了一个问题,我们之前的请求方式,发生了变化,直接去请求,php接不到我...

Retrofit源码解析:RxJavaCallAdapterFactory

上篇博客Retrofit源码解析我们讲到了retrofit所采用的注解方法会交由ServiceMethod的callAdapter 去进行层层解析,然后交由OkHttpCall 去执行具体的请求 并且...

Retrofit 2 之自定义Converter实现加密解密

版权声明:本文为博主原创文章,未经博主允许不得转载。如果你还不知道,Retrofit2是什么,请你移步到hangyang的博客,认真看他写的 Retrofit2 完全解析 探索与okhttp之间的关系...

RxJava(十)switchIfEmpty操作符实现Android检查本地缓存逻辑判断

switchIfEmpty(Observable emptyObservable)操作符从字面意思上就很好理解,就是当为空的时候跳转到emptyObservable。那么如何理解当为空的时候. 下面将...

RxJava(十一)defer操作符实现代码支持链式调用

前言现在越来越多Android开发者使用到RxJava,在Android使用RxJava主要有如下好处: 1,轻松切换线程。以前我们切换线程主要使用Handler等手段来做。 2,轻松解决回调的嵌...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)