关闭

解决rxjava导致的内存泄漏

3279人阅读 评论(5) 收藏 举报
分类:

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

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();
        }
    }
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:15810次
    • 积分:369
    • 等级:
    • 排名:千里之外
    • 原创:20篇
    • 转载:0篇
    • 译文:0篇
    • 评论:36条
    文章分类
    最新评论