解决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();
        }
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。

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

本文转自:http://blog.csdn.net/adzcsx2 RxJava在现在是一个非常前卫的异步框架,也是由于他非常新,所以比较难以驾驭。 像okhttp直接在onStop或者onDe...
  • jdsjlzx
  • jdsjlzx
  • 2016年05月23日 16:06
  • 4951

RxJava Subscription 自动取消订阅

在RxJava Observer与Subscriber的关系 一文中,我们提到: subscribe(mObserver)和subscribe(mSubscriber)执行结果就会有区别: ...
  • jdsjlzx
  • jdsjlzx
  • 2016年05月30日 23:09
  • 14030

RxJava Subscription 自动取消订阅

在RxJava Observer与Subscriber的关系 一文中,我们提到: subscribe(mObserver)和subscribe(mSubscriber)执行结果就会有区别: ...

Retrofit2.0+ RxJava 优雅的取消重复避免并取消请求(十一)

Tamic/文  地址:http://blog.csdn.net/sk719887916/article/details/52132106 前几篇主要介绍了retrofit基本使用,结合rxJa...

RxJava interval 操作符 取消订阅

interval会创建一个按照给定的时间间隔发射从0开始的整数序列的Observable,内部通过OnSubscribeTimerPeriodically工作。 Observable.interva...
  • slikang
  • slikang
  • 2017年05月25日 09:55
  • 424

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

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

RxJava(十三)RxJava导致Fragment Activity内存泄漏问题

RxJava导致Fragment Activity内存泄漏问题。所以`onTerminateDetach`操作符要和`subscription.unsubscribe()` 结合使用,因为不执行`su...

Android rxjava内存泄漏问题

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

一张图搞定-RxJava2的线程切换原理和内存泄露问题

RxJava2的线程切换原理和内存泄露问题分析 不管你信不信,一张图搞定此问题

Rxlifecycle使用详解,解决RxJava内存泄露问题

随着Android第三库的普及, RxJava 和 RxAndroid ( https://github.com/ReactiveX/RxAndroid )越来越被人熟知,简洁的语法,配合Java8 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:解决rxjava导致的内存泄漏
举报原因:
原因补充:

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