Android性能优化之利用Rxlifecycle解决RxJava内存泄漏详解

 更新时间:2017年01月12日 16:03:16   作者:总李写代码  
RxJava作为一种响应式编程框架,是目前编程界网红,可谓是家喻户晓,其简洁的编码风格、易用易读的链式方法调用、强大的异步支持等使得RxJava被广泛使用。

前言:

其实RxJava引起的内存泄漏是我无意中发现了,本来是想了解Retrofit与RxJava相结合中是如何通过适配器模式解决的,结果却发现了RxJava是会引起内存泄漏的,所有想着查找一下资料学习一下如何解决RxJava引起的内存泄漏,就查到了利用Rxlifecycle开源框架可以解决,今天周末就来学习一下如何使用Rxlifecycle。

引用泄漏的背景:

RxJava作为一种响应式编程框架,是目前编程界网红,可谓是家喻户晓,其简洁的编码风格、易用易读的链式方法调用、强大的异步支持等使得RxJava被广泛使用,它通过线程调度器更容易控制和切换线程,如果该工作线程还没执行结束就退出Activity或者Fragment,就会Activity或者Fragment无法释放引起内存泄漏。

什么是Rxlifecycle?

rxlifecycle是trello开发的用于解决RxJava引起的内存泄漏的开源框架。

 github地址:https://github.com/trello/RxLifecycle

如何使用Rxlifecycle?

1.)在build.gradle文件中添加引用

compile 'com.trello:rxlifecycle:1.0'

// If you want to bind to Android-specific lifecycles
compile 'com.trello:rxlifecycle-android:1.0'

// If you want pre-written Activities and Fragments you can subclass as providers
compile 'com.trello:rxlifecycle-components:1.0'

// If you want to use Navi for providers
compile 'com.trello:rxlifecycle-navi:1.0'

// If you want to use Kotlin syntax
compile 'com.trello:rxlifecycle-kotlin:1.0'

 根据自己的需要添加 我这里使用了如下两个

 compile 'com.trello:rxlifecycle:1.0'
 compile 'com.trello:rxlifecycle-components:1.0'

2.)根据不同的需要Activity继承RxActivity ,Fragment继承RxFragment 

public class MainActivity7 extends RxActivity {
  private TextView mTextView;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mTextView = (TextView) findViewById(R.id.text);
    //模拟内存泄露
    testRxJava();
    finish();
  }

  private void testRxJava() {
    Observable.create(new Observable.OnSubscribe<String>() {
      @Override
      public void call(Subscriber<? super String> subscriber) {
        int i = 0;
        while (i < 1000000000) {
          i++;
        }
        subscriber.onNext(String.valueOf(i));
        subscriber.onCompleted();
      }
    }).compose(this.<String>bindUntilEvent(ActivityEvent.PAUSE))
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Action1<String>() {
          @Override
          public void call(String s) {
            mTextView.setText(s);
          }
        });

  }


  @Override
  protected void onDestroy() {
    super.onDestroy();
    LApplication.getRefWatcher().watch(this);
  }
}

 目前支持的Activity/Fragment 结构图

 

3.)使用bindToLifecycle()的方式

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

 Observable.create(new Observable.OnSubscribe<String>() {
      @Override
      public void call(Subscriber<? super String> subscriber) {
        int i = 0;
        while (i < 1000000000) {
          i++;
        }
        subscriber.onNext(String.valueOf(i));
        subscriber.onCompleted();
      }
    }).compose(this.<String>bindToLifecycle())
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Action1<String>() {
          @Override
          public void call(String s) {
            mTextView.setText(s);
          }
        });

4.)使用bindUntilEvent()方式

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

 Observable.create(new Observable.OnSubscribe<String>() {
      @Override
      public void call(Subscriber<? super String> subscriber) {
        int i = 0;
        while (i < 1000000000) {
          i++;
        }
        subscriber.onNext(String.valueOf(i));
        subscriber.onCompleted();
      }
    }).compose(this.<String>bindUntilEvent(ActivityEvent.PAUSE))
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Action1<String>() {
          @Override
          public void call(String s) {
            mTextView.setText(s);
          }
        });

 5.)自定义一个RxActivity/RxFragment

只需要你想要的Activity实现LifecycleProvider<ActivityEvent>接口就可以了,这里贴出RxActivity的源码仿照它做下修改即可。 

public abstract class RxActivity extends Activity implements LifecycleProvider<ActivityEvent> {
  private final BehaviorSubject<ActivityEvent> lifecycleSubject = BehaviorSubject.create();

  public RxActivity() {
  }

  @NonNull
  @CheckResult
  public final Observable<ActivityEvent> lifecycle() {
    return this.lifecycleSubject.asObservable();
  }

  @NonNull
  @CheckResult
  public final <T> LifecycleTransformer<T> bindUntilEvent(@NonNull ActivityEvent event) {
    return RxLifecycle.bindUntilEvent(this.lifecycleSubject, event);
  }

  @NonNull
  @CheckResult
  public final <T> LifecycleTransformer<T> bindToLifecycle() {
    return RxLifecycleAndroid.bindActivity(this.lifecycleSubject);
  }

  @CallSuper
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.lifecycleSubject.onNext(ActivityEvent.CREATE);
  }

  @CallSuper
  protected void onStart() {
    super.onStart();
    this.lifecycleSubject.onNext(ActivityEvent.START);
  }

  @CallSuper
  protected void onResume() {
    super.onResume();
    this.lifecycleSubject.onNext(ActivityEvent.RESUME);
  }

  @CallSuper
  protected void onPause() {
    this.lifecycleSubject.onNext(ActivityEvent.PAUSE);
    super.onPause();
  }

  @CallSuper
  protected void onStop() {
    this.lifecycleSubject.onNext(ActivityEvent.STOP);
    super.onStop();
  }

  @CallSuper
  protected void onDestroy() {
    this.lifecycleSubject.onNext(ActivityEvent.DESTROY);
    super.onDestroy();
  }
}

 总结:

本文总结了通过RxLifeCycle解决RxJava的内存泄漏问题,同时也给我们提了一个警告,再好的框架都有它好的一面也有坏的一面,这时做好技术选型以及规避风险就很重要了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • ObjectAnimator属性动画源码分析篇

    ObjectAnimator属性动画源码分析篇

    今天小编就为大家分享一篇关于ObjectAnimator属性动画源码分析篇,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Android自动化获取卡顿信息的实现方法

    Android自动化获取卡顿信息的实现方法

    自动化获取卡顿信息就像给App装  “行车记录仪”  —— 实时记录主线程的“驾驶状态”,一旦发现“急刹车”(卡顿),立刻保存现场(堆栈),事后回看录像(日志)精准定位问题,本文给大家介绍了Android自动化获取卡顿信息的实现方法,需要的朋友可以参考下
    2025-02-02
  • Android MTU 值修改的实例详解

    Android MTU 值修改的实例详解

    这篇文章主要介绍了Android MTU 值修改的实例详解的相关资料,希望通过此文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • Android AIDL实现进程间通信探索

    Android AIDL实现进程间通信探索

    这篇文章主要为大家详细介绍了Android AIDL实现进程间通信的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • 超酷炫的Android碎纸机效果推荐

    超酷炫的Android碎纸机效果推荐

    这篇文章运用xml和java实现了Android版的碎纸机动画,效果非常好,推荐给有需要的小伙伴们使用。
    2016-07-07
  • Android 全局通知弹窗示例分析详解

    Android 全局通知弹窗示例分析详解

    这篇文章主要为大家介绍了Android 全局通知弹窗实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Android使用表格布局设计注册界面

    Android使用表格布局设计注册界面

    这篇文章主要为大家详细介绍了Android使用表格布局设计注册界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • android仿京东商品属性筛选功能

    android仿京东商品属性筛选功能

    这篇文章主要为大家详细介绍了android仿京东商品属性筛选功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Android 监听WiFi的开关状态实现代码

    Android 监听WiFi的开关状态实现代码

    这篇文章主要介绍了Android 监听WiFi的开关状态实现代码的相关资料,需要的朋友可以参考下
    2017-05-05
  • Android 接收微信、QQ其他应用打开第三方分享功能

    Android 接收微信、QQ其他应用打开第三方分享功能

    这篇文章主要介绍了Android 接收微信、QQ其他应用打开,第三方分享 ,思路很简单通过在AndroidManifest.xml注册ACTION事件,在用于接收分享的Activity里面加接收代码,感兴趣的朋友可以一起学习下
    2022-11-11

最新评论