全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android性能优化之利用Rxlifecycle解决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的内存泄漏问题,同时也给我们提了一个警告,再好的框架都有它好的一面也有坏的一面,这时做好技术选型以及规避风险就很重要了。

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


# rxjava  # rxlifecycle  # 内存泄露  # android  # 总结Android App内存优化之图片优化  # Android性能优化之利用强大的LeakCanary检测内存泄漏及解决办法  # 详解Android的内存优化--LruCache  # Android Bitmap详解及Bitmap的内存优化  # Android 优化Handler防止内存泄露  # 浅谈Android性能优化之内存优化  # 详解Android内存泄露及优化方案  # 详解Android内存优化策略  # Android 内存优化知识点梳理总结  # 链式  # 如何使用  # 开源  # 自己的  # 发现了  # 就会  # 都有  # 也有  # 还没  # 子类  # 结构图  # 很重要  # 想了  # 无意中  # 自定义  # 只需要  # 家喻户晓  # 就来  # 更容易  # 易用 


相关文章: 如何通过智能用户系统一键生成高效建站方案?  网站制作说明怎么写,简述网页设计的流程并说明原因?  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  为什么Go需要go mod文件_Go go mod文件作用说明  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  表情包在线制作网站免费,表情包怎么弄?  如何通过宝塔面板实现本地网站访问?  再谈Python中的字符串与字符编码(推荐)  装修招标网站设计制作流程,装修招标流程?  如何快速辨别茅台真假?关键步骤解析  5种Android数据存储方式汇总  C#怎么创建控制台应用 C# Console App项目创建方法  宝华建站服务条款解析:五站合一功能与SEO优化设置指南  金*站制作公司有哪些,金华教育集团官网?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  代刷网站制作软件,别人代刷火车票靠谱吗?  高端建站如何打造兼具美学与转化的品牌官网?  如何通过云梦建站系统实现SEO快速优化?  如何在云主机快速搭建网站站点?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  Android自定义listview布局实现上拉加载下拉刷新功能  Swift中switch语句区间和元组模式匹配  网站好制作吗知乎,网站开发好学吗?有什么技巧?  宁波免费建站如何选择可靠模板与平台?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  小型网站建站如何选择虚拟主机?  如何在服务器上配置二级域名建站?  公司网站的制作公司,企业网站制作基本流程有哪些?  建站主机是否等同于虚拟主机?  网站制作员失业,怎样查看自己网站的注册者?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?  焦点电影公司作品,电影焦点结局是什么?  智能起名网站制作软件有哪些,制作logo的软件?  已有域名建站全流程解析:网站搭建步骤与建站工具选择  常州企业建站如何选择最佳模板?  ,网页ppt怎么弄成自己的ppt?  linux top下的 minerd 木马清除方法  c# 在ASP.NET Core中管理和取消后台任务  jQuery 常见小例汇总  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  建站之星导航如何优化提升用户体验?  家具网站制作软件,家具厂怎么跑业务?  制作公司内部网站有哪些,内网如何建网站?  如何快速启动建站代理加盟业务?  家庭服务器如何搭建个人网站?  建站之星如何通过成品分离优化网站效率?  常州企业网站制作公司,全国继续教育网怎么登录?  如何有效防御Web建站篡改攻击? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。