`
dengzhangtao
  • 浏览: 668063 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

RXJava2内存泄露处理

 
阅读更多
内存泄露处理

基本代码:

private final CompositeDisposable disposables = new CompositeDisposable();

public void doSomeWork2() {
    // 1. 创建一个普通的 observable
    Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
        @Override
        public void subscribe(ObservableEmitter<String> e) throws Exception {
            if (e.isDisposed()) return;
            SystemClock.sleep(2000);
            e.onNext("next");
            e.onComplete();
        }
    });

    // 2. 创建一个可被 CompositeDisposable 管理的 observer
    DisposableObserver<String> observer = new DisposableObserver<String>() {
        @Override
        public void onNext(String value) {

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onComplete() {

        }
    };

    // 3. 订阅事件
    observable.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(observer);

    // 4. 将需要被 CompositeDisposable 管理的 observer 加入到管理集合中
    disposables.add(observer);
}

在 Activity/Fragment 销毁生命周期中取消异步操作防止内存泄露:

@Override
protected void onDestroy() {
    super.onDestroy();
    // 将所有的 observer 取消订阅
    disposables.clear();
}

在 mvp 的项目中处理内存泄露

基于 google todo-mvp-rxjava 搭建项目 mvp 框架:

BasePresenter :

public abstract class BasePresenter {

    CompositeDisposable mCompositeDisposable = new CompositeDisposable();

    public void unSubscribe() {
        mCompositeDisposable.clear();
    }


    public void register(Disposable disposable) {
        mCompositeDisposable.add(disposable);
    }


}

一个例子 SimplePresenter extends BasePresenter :

public class SimplePresenter extends BasePresenter {
    private static final String TAG = SimplePresenter.class.getSimpleName();

    //...构造方法..


    public void startWork() {

        DisposableObserver<Long> observer = new DisposableObserver<Long>() {
            @Override
            public void onNext(Long value) {
                Log.d(TAG, "onNext: ");
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        };
        Observable.interval(2000, TimeUnit.MILLISECONDS)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(observer);

        register(observer);

    }

}

注意:在使用 RxJava 做异步操作的时候,调用 register(observer); 注册 observer 到 CompositeDisposable 中统一管理。

Activity/Fragment:

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

慎用 functions

functions:Action,Consumer,Function 等

原因:这些方法只会对 onNext 事件进行处理,如果 observable 中出现异常产生了 onError 事件就会导致 app 奔溃。

解决方案:

    不用简化方法
    自己封装一个:

封装一个类似下面的基类:

public abstract class BaseDisposableObserver<T> extends DisposableObserver<T> {

    private static final String TAG = BaseDisposableObserver.class.getSimpleName();

    @Override
    public void onError(Throwable e) {
        Log.e(TAG, "onError: " + e.getMessage());
    }

    @Override
    public void onComplete() {

    }
}

使用的时候和 functions 是一样的:(这样下面的代码就不会导致app奔溃了)

BaseDisposableObserver<Long> baseDisposableObserver = new BaseDisposableObserver<Long>() {
    @Override
    public void onNext(Long value) {
        Log.d(TAG, "onNext: ");
    }
};

Observable.interval(2000, TimeUnit.MILLISECONDS)
        .filter(new Predicate<Long>() {
            @Override
            public boolean test(Long aLong) throws Exception {
                Log.d(TAG, "test: along:" + aLong);

                if (aLong > 2) {
                    throw new Exception("sdf");
                }

                return true;
            }
        })
//                .subscribeOn(Schedulers.io())
//                .observeOn(AndroidSchedulers.mainThread())
        .subscribe(baseDisposableObserver);

    RxJava 看的还不多,如有错误还请指出

作者:Passon_Fang
链接:https://www.jianshu.com/p/b672724dbff8
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
分享到:
评论

相关推荐

    详解RxJava2 Retrofit2 网络框架简洁轻便封装

    前言 RxJava2、Retrofit2火了有一段... RxJava2内存泄漏的处理 异步请求加入Loading Dialog 依赖 implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' implementation 'io.reactivex.rxjava2:rxjava:2.1.3' i

    RxLifecycleOwner:使用RxJava2的Android体系结构组件的生命周期处理API

    RxLifeCycle可以有效处理Activity和Fragment的生命周期,并防止内存泄漏。 但是,RxLifeCycle尊重运算符。 因此,它的行为与取消/处置不同。 特别是Single + TakeUntil将调用onError(CancellationException)。 ...

    Android代码-Rx-Mvp

    Rx-Mvp ...使用 RxLifecycle2 管理生命周期,再也不用担心 RxJava 使用不当造成内存泄漏 基础网络请求,数据转换为 String 并提供 onConvert 方法提供开发者自定义转化数据 上传带进度回调,多文件情况下

    RxLifecycle:使用 RxJava 的 Android 应用程序生命周期处理 API-开源

    此功能在 Android 中很有用,因为不完整的订阅会导致内存泄漏。 你必须从一个 Observable 开始表示生命周期流。 然后使用 RxLifecycle 将序列绑定到该生命周期。 它假设您想在相反的生命周期事件中结束序列——例如...

    rxlint:Android 的 lint 检查以检查您的 RxJava 代码

    默认情况下,对于 RxJava 1.x 未处理的每个错误, 将抛出一个包装在IllegalStateException的OnErrorNotImplemented异常,或者如果您使用的是 2.0.6 版之前的 RxJava 2.x,则会直接调用默认的未捕获异常处理程序。...

    使用RxJava中遇到的一些”坑“

    RxJava中一个常用的使用方法是——在其他线程中做处理,然后切换到UI线程中去更新页面。其中,线程切换就是使用了observeOn()。后台下载文件,前台显示下载进度就可以使用这种方式完成。然而,实践发现这其中有坑。...

    RxLifecycle:使用RxJava的Android应用程序的生命周期处理API

    此功能在Android中很有用,因为其中不完整的订阅可能会导致内存泄漏。 用法 您必须从表示生命周期流的Observable开始。 然后,您可以使用RxLifecycle将序列绑定到该生命周期。 您可以在生命周期发出任何东西时进行...

    MvpRxjavaRetrofitDemo

    android—mvp+retrofit+rxjava+okhttp的demo ,封装baseActivity BaseView BasePresenter处理解决内存泄漏

    MVP_demo:本项目主要搭建MVP+RxJava+Retrofit+okhttp3项目模板

    MVP_demo 本文主要根据自身项目的使用和对MVP的理解,搭建符合自身项目情况的MVP架构。 关于MVP M(Model)负责数据的请求,解析,过滤等数据操作。...把业务逻辑抽到Presenter中去,避免复杂业务逻辑造成的内存泄漏。

    轻量级的Android MVP快速开发框架

    无需担心rx内存泄漏 适配AndroidX,请前往android-x分支 保留: 提供XActivity、XFragment、SimpleRecAdapter、SimpleListAdapter等基类,可快速进行开发 完整封装XRecyclerView,可实现绝大部分需求 ...

    leetcode答案-Note_forUnity:这是我学习Unity3D的笔记

    :防止RxJava中subscription导致内存泄漏 :基于RxJava开发的用于帮助在Android 6.0中处理运行时权限检测 :目前最好用的网络通讯库,应该都用过吧 :okhttp和retrofit做网络通讯是绝配 :ORM数

    Meteorite.zip

    Meteorite.zip,这个项目涉及到如下技术的实际应用:1、MVP 2、网络请求(Novate基于rxjava,okhttp,retrofit封装架构)3、DbFlow(可保存文件入SD卡) 4、6.0权限申请 5、XRecyclerView 6、万能Adapter7、异常处理 8、...

    MVVMLin:一个基于MVVM用Kotlin+Retrofit+协程+Databinding+LiveData来封装的快速开发框架

    MVVMLin 一个基于MVVM用Kotlin+Retrofit+协程+Databinding(View...使用Rxjava 处理不好的话会有内存泄露的风险,我们会用使用AutoDispose、RxLifecycle等方式来处理,但是使用协程来请求数据,完全不用担心这个问题,

    XDroidMvp:轻量级的Android MVP快速开发框架

    #XDroidMvp轻量级的Android MVP快速开发框架 概述 ...无需担心rx内存泄漏 适应AndroidX,请前往android-x分支 保留: 提供XActivity , XFragment , SimpleRecAdapter , SimpleListAdapter等基类,

    Android-Base-Google-Architectures:从Google Architectures,我正在做基础项目

    使用LiveData,ViewModel,LifecycleObserver和LifecycleOwner进行有效的配置更改,避免内存泄漏,并轻松将数据加载到UI中。 会议室:SQLite对象映射库 避免使用样板代码,并使用Room轻松将SQLite表数据转换为Java...

    Eyepetizer:仿开眼app,kotlin,mvvm

    &lt;Kotlin&gt;&gt;接口参考项目截图 更新日志v1.0.0大致框架完成,精选-发现-我的感谢以下开源库日志多状态切换view内存泄漏检查刷新库权限检查图片处理图片轮播 https://github.com/bingoogolapple/BGABanner-Android底部...

Global site tag (gtag.js) - Google Analytics