最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android性能優(yōu)化之利用Rxlifecycle解決RxJava內(nèi)存泄漏詳解

 更新時(shí)間:2017年01月12日 16:03:16   作者:總李寫代碼  
RxJava作為一種響應(yīng)式編程框架,是目前編程界網(wǎng)紅,可謂是家喻戶曉,其簡潔的編碼風(fēng)格、易用易讀的鏈?zhǔn)椒椒ㄕ{(diào)用、強(qiáng)大的異步支持等使得RxJava被廣泛使用。

前言:

其實(shí)RxJava引起的內(nèi)存泄漏是我無意中發(fā)現(xiàn)了,本來是想了解Retrofit與RxJava相結(jié)合中是如何通過適配器模式解決的,結(jié)果卻發(fā)現(xiàn)了RxJava是會引起內(nèi)存泄漏的,所有想著查找一下資料學(xué)習(xí)一下如何解決RxJava引起的內(nèi)存泄漏,就查到了利用Rxlifecycle開源框架可以解決,今天周末就來學(xué)習(xí)一下如何使用Rxlifecycle。

引用泄漏的背景:

RxJava作為一種響應(yīng)式編程框架,是目前編程界網(wǎng)紅,可謂是家喻戶曉,其簡潔的編碼風(fēng)格、易用易讀的鏈?zhǔn)椒椒ㄕ{(diào)用、強(qiáng)大的異步支持等使得RxJava被廣泛使用,它通過線程調(diào)度器更容易控制和切換線程,如果該工作線程還沒執(zhí)行結(jié)束就退出Activity或者Fragment,就會Activity或者Fragment無法釋放引起內(nèi)存泄漏。

什么是Rxlifecycle?

rxlifecycle是trello開發(fā)的用于解決RxJava引起的內(nèi)存泄漏的開源框架。

 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'

 根據(jù)自己的需要添加 我這里使用了如下兩個(gè)

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

2.)根據(jù)不同的需要Activity繼承RxActivity ,F(xiàn)ragment繼承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);
    //模擬內(nèi)存泄露
    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 結(jié)構(gòu)圖

 

3.)使用bindToLifecycle()的方式

在子類使用Observable中的compose操作符,調(diào)用,完成Observable發(fā)布的事件和當(dāng)前的組件綁定,實(shí)現(xiàn)生命周期同步。從而實(shí)現(xiàn)當(dāng)前組件生命周期結(jié)束時(shí),自動取消對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分別對應(yīng)生命周期內(nèi)的方法。使用bindUntilEvent指定在哪個(gè)生命周期方法調(diào)用時(shí)取消訂閱。

 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.)自定義一個(gè)RxActivity/RxFragment

只需要你想要的Activity實(shí)現(xiàn)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();
  }
}

 總結(jié):

本文總結(jié)了通過RxLifeCycle解決RxJava的內(nèi)存泄漏問題,同時(shí)也給我們提了一個(gè)警告,再好的框架都有它好的一面也有壞的一面,這時(shí)做好技術(shù)選型以及規(guī)避風(fēng)險(xiǎn)就很重要了。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • ObjectAnimator屬性動畫源碼分析篇

    ObjectAnimator屬性動畫源碼分析篇

    今天小編就為大家分享一篇關(guān)于ObjectAnimator屬性動畫源碼分析篇,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Android自動化獲取卡頓信息的實(shí)現(xiàn)方法

    Android自動化獲取卡頓信息的實(shí)現(xiàn)方法

    自動化獲取卡頓信息就像給App裝  “行車記錄儀”  —— 實(shí)時(shí)記錄主線程的“駕駛狀態(tài)”,一旦發(fā)現(xiàn)“急剎車”(卡頓),立刻保存現(xiàn)場(堆棧),事后回看錄像(日志)精準(zhǔn)定位問題,本文給大家介紹了Android自動化獲取卡頓信息的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2025-02-02
  • Android MTU 值修改的實(shí)例詳解

    Android MTU 值修改的實(shí)例詳解

    這篇文章主要介紹了Android MTU 值修改的實(shí)例詳解的相關(guān)資料,希望通過此文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Android AIDL實(shí)現(xiàn)進(jìn)程間通信探索

    Android AIDL實(shí)現(xiàn)進(jìn)程間通信探索

    這篇文章主要為大家詳細(xì)介紹了Android AIDL實(shí)現(xiàn)進(jìn)程間通信的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 超酷炫的Android碎紙機(jī)效果推薦

    超酷炫的Android碎紙機(jī)效果推薦

    這篇文章運(yùn)用xml和java實(shí)現(xiàn)了Android版的碎紙機(jī)動畫,效果非常好,推薦給有需要的小伙伴們使用。
    2016-07-07
  • Android?全局通知彈窗示例分析詳解

    Android?全局通知彈窗示例分析詳解

    這篇文章主要為大家介紹了Android?全局通知彈窗實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Android使用表格布局設(shè)計(jì)注冊界面

    Android使用表格布局設(shè)計(jì)注冊界面

    這篇文章主要為大家詳細(xì)介紹了Android使用表格布局設(shè)計(jì)注冊界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • android仿京東商品屬性篩選功能

    android仿京東商品屬性篩選功能

    這篇文章主要為大家詳細(xì)介紹了android仿京東商品屬性篩選功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android 監(jiān)聽WiFi的開關(guān)狀態(tài)實(shí)現(xiàn)代碼

    Android 監(jiān)聽WiFi的開關(guān)狀態(tài)實(shí)現(xiàn)代碼

    這篇文章主要介紹了Android 監(jiān)聽WiFi的開關(guān)狀態(tài)實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Android 接收微信、QQ其他應(yīng)用打開第三方分享功能

    Android 接收微信、QQ其他應(yīng)用打開第三方分享功能

    這篇文章主要介紹了Android 接收微信、QQ其他應(yīng)用打開,第三方分享 ,思路很簡單通過在AndroidManifest.xml注冊ACTION事件,在用于接收分享的Activity里面加接收代碼,感興趣的朋友可以一起學(xué)習(xí)下
    2022-11-11

最新評論

靖西县| 静宁县| 泸水县| 长兴县| 自治县| 新平| 连南| 高淳县| 商城县| 白河县| 庄河市| 琼结县| 济宁市| 鄱阳县| 陆良县| 沅陵县| 二连浩特市| 治多县| 灵丘县| 车致| 宝鸡市| 崇左市| 容城县| 永城市| 临武县| 怀仁县| 泰顺县| 惠州市| 普兰店市| 临沭县| 靖宇县| 柳河县| 金沙县| 且末县| 合川市| 兖州市| 吉木乃县| 兴海县| 秦皇岛市| 长子县| 依兰县|