国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

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

2019-12-12 04:02:45
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言:

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

引用泄漏的背景:

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

什么是Rxlifecycle?

rxlifecycle是trello開(kāi)發(fā)的用于解決RxJava引起的內(nèi)存泄漏的開(kā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 lifecyclescompile 'com.trello:rxlifecycle-android:1.0'// If you want pre-written Activities and Fragments you can subclass as providerscompile 'com.trello:rxlifecycle-components:1.0'// If you want to use Navi for providerscompile 'com.trello:rxlifecycle-navi:1.0'// If you want to use Kotlin syntaxcompile '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í),自動(dòng)取消對(duì)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分別對(duì)應(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é)了通過(guò)RxLifeCycle解決RxJava的內(nèi)存泄漏問(wèn)題,同時(shí)也給我們提了一個(gè)警告,再好的框架都有它好的一面也有壞的一面,這時(shí)做好技術(shù)選型以及規(guī)避風(fēng)險(xiǎn)就很重要了。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 长宁县| 金塔县| 克拉玛依市| 雅江县| 南漳县| 安吉县| 新源县| 安徽省| 镇远县| 永昌县| 开封县| 奉新县| 威海市| 乌拉特后旗| 石城县| 浮山县| 巧家县| 花垣县| 黄浦区| 电白县| 葫芦岛市| 陵川县| 平湖市| 东明县| 通城县| 游戏| 海安县| 肇源县| 丰城市| 阜城县| 克拉玛依市| 彰化市| 山丹县| 敦煌市| 孝昌县| 金寨县| 峨眉山市| 永寿县| 依安县| 安图县| 齐齐哈尔市|