`
dengzhangtao
  • 浏览: 670525 次
  • 性别: 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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
分享到:
评论

相关推荐

    一行代码解决RxJava 内存泄漏,一款轻量级别的RxJava生命周期管理库

    在Android开发中,RxJava是一个广泛使用的异步编程库,它允许开发者以声明式的方式处理事件和数据流。然而,不正确的使用往往会导致内存泄漏,影响应用性能和用户体验。本篇将详细介绍如何通过一个轻量级的RxJava...

    RxJava2+Retrofit2实现简单易用的网络请求框架

    RxJava2是一个响应式编程库,它将异步操作转化为一系列数据流(或事件),通过观察者模式进行处理。响应式编程允许开发者以声明式的方式处理数据流,这使得代码更易于理解和维护。RxJava2引入了Backpressure机制,...

    安卓开发进阶之RxJava2在实际项目中使用--第三篇

    2. **在Android中的应用**:如何在Activity或Fragment中使用RxJava处理异步任务,如何在生命周期方法中管理订阅,以防止内存泄漏。 3. **与Realm结合**:如何利用RxJava2的特性来实现 Realm 数据的实时监听和更新,...

    Rxjava2学习demo

    通过"RxJava2学习demo",你可以看到如何实际应用这些概念,创建复杂的异步流程,并了解如何优化性能和避免内存泄漏。实践中,你可以尝试构建不同的数据管道,结合各种操作符,以掌握RxJava2的强大功能。不断积累这些...

    rxjava2demo.zip

    RxJava2.x 是一个在Android开发中广泛使用的异步编程库,它引入了反应式编程的概念,使得处理事件和数据流变得更加简洁、高效。在这个"rxjava2demo.zip"压缩包中,包含了一个详细的Android RxJava2.x 示例项目,帮助...

    RXjava2 demo

    RXJava2是一个强大的异步处理库,被广泛应用于Android开发中。它引入了一种响应式编程的模式,能够简化复杂的事件处理和数据流管理。在这个"RXjava2 demo"中,我们可以通过运行示例来深入理解RXJava2的核心概念和...

    rxjava2pdf

    RxJava2提供了一些生命周期相关的操作符,如`takeUntil()`、`takeWhile()`,用于在特定条件满足时结束数据流,避免内存泄漏。 **背压策略** 在高频率数据流和低处理速度之间,可能出现背压问题。RxJava2支持几种...

    Retrofit2+Rxjava2 demo

    4. 当然,别忘了在应用退出时取消订阅,防止内存泄漏。 ```java Disposable disposable = apiService.fetchData().subscribe(...); // 在适当的时候取消订阅 disposable.dispose(); ``` 通过下载的"Retrofit2Rxjava...

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

    在本资源中,RxJava2内存泄漏的处理通过使用RxLifecycle实现,RxLifecycle用于管理RxJava2的生命周期,防止内存泄漏的出现。 知识点7:Loading Dialog的实现 Loading Dialog是指异步请求过程中的等待对话框。在本...

    Android-rxjava2retrofit2rxlifecycle2有生命周期感知的网络请求框架封装

    在Android应用开发中,网络请求是必不可少的一部分,而有效地管理和处理网络请求的生命周期可以避免内存泄漏、提高用户体验。本文将详细介绍如何使用RxJava2、Retrofit2和RxLifecycle2这三款强大的工具来构建一个...

    Android中rxjava2的基本使用

    在Android开发中,RxJava2是一个非常重要的库,它引入了反应式编程的概念,使得异步处理、事件处理以及数据流管理变得更加优雅和简洁。本文将深入探讨RxJava2的基本使用,包括其核心概念、主要操作符以及如何在...

    Rxjava2 demo

    RxJava2是一个强大的Java库,它允许开发人员通过使用可观察序列来处理异步操作和事件。这个"RxJava2 Demo"旨在展示如何在实际应用中有效地利用RxJava2的功能。RxJava的核心概念是响应式编程,这是一种处理数据流和...

    AutoDispose,自动绑定+处理RXJava 2流。.zip

    AutoDispose通过提供一种自动绑定和处理RXJava 2流的方法,使得订阅的生命周期与Android组件(如Activity、Fragment)的生命周期相匹配。这意味着当你的Activity或Fragment结束时,相关的RXJava订阅也会自动取消,...

    最简单易懂的RxJava2学习教程(一)

    在Android中,RxJava2常与Android的生命周期紧密结合,避免内存泄漏和不必要的资源消耗。例如,使用`subscribeOn()`指定数据的产生线程,`observeOn()`指定数据的消费线程,以及`Disposable`接口来管理订阅,确保在...

    Rxjava2、Retrofit网络请求

    - 使用Retrofit的`CallAdapter`配合RxJava,可以更好地控制请求生命周期,避免内存泄漏。 - 使用`CompositeDisposable`管理多个订阅,便于一次性取消所有订阅。 - 注意内存管理,避免在Activity或Fragment中直接...

    android-subscription-leaks,使用rxjava时演示内存泄漏解决方案的小示例应用程序.zip

    在Android开发中,内存泄漏是一个常见且严重的问题,尤其是在使用RxJava这样的复杂异步库时。这个名为"android-subscription-leaks"的开源项目提供了一个小示例应用程序,专门用于演示如何在使用RxJava时避免内存...

    基于Rxjava2的事件总线:Rxbus

    4. **取消订阅**:为了防止内存泄漏,当不再需要接收事件时,记得取消订阅。 ```java subscription.dispose(); ``` **RxBus的优点** 1. **解耦**:RxBus允许组件之间松散耦合,不需要知道事件的来源或目的地。 2. ...

    RxJava2.x的集成

    使用`subscribeOn`和`observeOn`来控制在哪个线程上执行操作,并确保在适当的时候取消订阅,以防止内存泄漏。`Disposable`对象可以用来管理订阅的生命周期。 ### 7. 示例代码 在`RxJavaDemo`项目中,你可以找到...

    Android-rxjava2线程间流式处理asynctask

    `RxJava2` 和 `AsyncTask` 是两种常用的异步处理工具,但它们在处理线程间数据流的方式上有所不同。`RxJava2` 提供了一种更加灵活、强大的流式处理方式,而 `AsyncTask` 是 Android 自带的一种轻量级异步解决方案。...

    最简单易懂的RxJava2.0学习教程之RxJava2的线程调度(二)

    在Android开发中,RxJava2.0已经成为处理...开发者需要根据任务类型和需求选择合适的调度器,确保应用流畅运行,同时避免内存泄漏和线程安全问题。在实际开发中,结合实践不断探索和优化,才能充分发挥RxJava2的优势。

Global site tag (gtag.js) - Google Analytics