日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

RxJava 和 RxAndroid 三(生命周期控制和内存优化)

發布時間:2025/5/22 Android 198 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RxJava 和 RxAndroid 三(生命周期控制和内存优化) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:對Rxjava、Rxandroid不了解的同學可以先看看
RxJava 和 RxAndroid
RxJava 和 RxAndroid 二(操作符的使用)

RxJava使我們很方便的使用鏈式編程,代碼看起來既簡潔又優雅。但是RxJava使用起來也是有副作用的,使用越來越多的訂閱,內存開銷也會變得很大,稍不留神就會出現內存溢出的情況,這篇文章就是介紹Rxjava使用過程中應該注意的事項。

1、取消訂閱 subscription.unsubscribe() ;

package lib.com.myapplication; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import rx.Observable; import rx.Subscription; import rx.functions.Action1;public class MainActivity extends AppCompatActivity {Subscription subscription ;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);subscription = Observable.just( "123").subscribe(new Action1<String>() {@Overridepublic void call(String s) {System.out.println( "tt--" + s );}}) ;}@Overrideprotected void onDestroy() {super.onDestroy();//取消訂閱if ( subscription != null ){subscription.unsubscribe();}} }

2、線程調度

  • Scheduler調度器,相當于線程控制器

    • Schedulers.immediate() : 直接在當前線程運行,相當于不指定線程。這是默認的 Scheduler。

    • Schedulers.newThread() :總是啟用新線程,并在新線程執行操作.

    • Schedulers.io():I/O 操作(讀寫文件、讀寫數據庫、網絡信息交互等)所使用的 Scheduler。行為模式和 newThread() 差不多,區別在于 io() 的內部實現是是用一個無數量上限的線程池,可以重用空閑的線程,因此多數情況下 io() 比 newThread() 更有效率。不要把計算工作放在 io() 中,可以避免創建不必要的線程。

    • Schedulers.computation() : 計算所使用的 Scheduler。這個計算指的是 CPU 密集型計算,即不會被 I/O 等操作限制性能的操作,例如圖形的計算。這個 Scheduler 使用的固定的線程池,大小為 CPU 核數。不要把 I/O 操作放在 computation() 中,否則 I/O 操作的等待時間會浪費 CPU。

    • 還有RxAndroid里面專門提供了AndroidSchedulers.mainThread(),它指定的操作將在 Android 主線程運行。

  • 常見的場景:為了不阻塞UI,在子線程加載數據,在主線線程顯示數據

    Observable.just( "1" , "2" , "3" ).subscribeOn(Schedulers.io()) //指定 subscribe() 發生在 IO 線程.observeOn( AndroidSchedulers.mainThread() ) //指定 Subscriber 的回調發生在主線程.subscribe(new Action1<String>() {@Overridepublic void call(String s) {textView.setText( s );}}) ;

    上面這段代碼,數據"1"、"2"、"3"將在io線程中發出,在android主線程中接收數據。這種【后臺獲取數據,前臺顯示數據】模式適用于大多數的程序策略。

  • Scheduler 自由多次切換線程。恩,這個更為牛逼

    Observable.just(1, 2, 3, 4) // IO 線程,由 subscribeOn() 指定.subscribeOn(Schedulers.io()).observeOn(Schedulers.newThread()).map(mapOperator) // 新線程,由 observeOn() 指定.observeOn(Schedulers.io()).map(mapOperator2) // IO 線程,由 observeOn() 指定.observeOn(AndroidSchedulers.mainThread) .subscribe(subscriber); // Android 主線程,由 observeOn() 指定

    從上面的代碼可以看出

    • observeOn() 可以調用多次來切換線程,observeOn 決定他下面的方法執行時所在的線程。

    • subscribeOn() 用來確定數據發射所在的線程,位置放在哪里都可以,但它是只能調用一次的。


  • 上面介紹了兩種控制Rxjava生命周期的方式,第一種:取消訂閱 ;第二種:線程切換 。這兩種方式都能有效的解決android內存的使用問題,但是在實際的項目中會出現很多訂閱關系,那么取消訂閱的代碼也就越來越多。造成了項目很難維護。所以我們必須尋找其他可靠簡單可行的方式,也就是下面要介紹的。

3、rxlifecycle 框架的使用

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

  • 在android studio 里面添加引用
    compile 'com.trello:rxlifecycle-components:0.6.1'

  • 讓你的activity繼承RxActivity,RxAppCompatActivity,RxFragmentActivity
    讓你的fragment繼承RxFragment,RxDialogFragment;下面的代碼就以RxAppCompatActivity舉例

  • bindToLifecycle 方法
    在子類使用Observable中的compose操作符,調用,完成Observable發布的事件和當前的組件綁定,實現生命周期同步。從而實現當前組件生命周期結束時,自動取消對Observable訂閱。

    public class MainActivity extends RxAppCompatActivity {TextView textView ;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = (TextView) findViewById(R.id.textView);//循環發送數字Observable.interval(0, 1, TimeUnit.SECONDS).subscribeOn( Schedulers.io()).compose(this.<Long>bindToLifecycle()) //這個訂閱關系跟Activity綁定,Observable 和activity生命周期同步.observeOn( AndroidSchedulers.mainThread()).subscribe(new Action1<Long>() {@Overridepublic void call(Long aLong) {System.out.println("lifecycle--" + aLong);textView.setText( "" + aLong );}});}}

    上面的代碼是Observable循環的發送數字,并且在textview中顯示出來
    1、沒加 compose(this.<Long>bindToLifecycle()) 當Activiry 結束掉以后,Observable還是會不斷的發送數字,訂閱關系沒有解除
    2、添加compose(this.<Long>bindToLifecycle()) 當Activity結束掉以后,Observable停止發送數據,訂閱關系解除。

  • 從上面的例子可以看出bindToLifecycle() 方法可以使Observable發布的事件和當前的Activity綁定,實現生命周期同步。也就是Activity 的 onDestroy() 方法被調用后,Observable 的訂閱關系才解除。那能不能指定在Activity其他的生命狀態和訂閱關系保持同步,答案是有的。就是 bindUntilEvent()方法。這個逼裝的好累!

  • bindUntilEvent( ActivityEvent event)

    • ActivityEvent.CREATE: 在Activity的onCreate()方法執行后,解除綁定。

    • ActivityEvent.START:在Activity的onStart()方法執行后,解除綁定。

    • ActivityEvent.RESUME:在Activity的onResume()方法執行后,解除綁定。

    • ActivityEvent.PAUSE: 在Activity的onPause()方法執行后,解除綁定。

    • ActivityEvent.STOP:在Activity的onStop()方法執行后,解除綁定。

    • ActivityEvent.DESTROY:在Activity的onDestroy()方法執行后,解除綁定。

    //循環發送數字Observable.interval(0, 1, TimeUnit.SECONDS).subscribeOn( Schedulers.io()).compose(this.<Long>bindUntilEvent(ActivityEvent.STOP )) //當Activity執行Onstop()方法是解除訂閱關系.observeOn( AndroidSchedulers.mainThread()).subscribe(new Action1<Long>() {@Overridepublic void call(Long aLong) {System.out.println("lifecycle-stop-" + aLong);textView.setText( "" + aLong );}});

    經過測試發現,當Activity執行了onStop()方法后,訂閱關系已經解除了。
    上面說的都是訂閱事件與Activity的生命周期同步,那么在Fragment里面又該怎么處理的?

  • FragmentEvent 這個類是專門處理訂閱事件與Fragment生命周期同步的大殺器

    public enum FragmentEvent {ATTACH, CREATE, CREATE_VIEW, START, RESUME, PAUSE, STOP, DESTROY_VIEW, DESTROY, DETACH }

    可以看出FragmentEvent 和 ActivityEvent 類似,都是枚舉類,用法是一樣的。這里就不舉例了!

總結
1、這三篇文章的相關代碼示例都在 http://git.oschina.net/zyj1609/RxAndroid_RxJava
2、通過上面的三種方法,我相信你在項目中使用Rxjava的時候,已經能夠很好的控制了 Rxjava對內存的開銷。如果你有其他的方法或者問題,可以留言給我。

?

RxJava 和 RxAndroid 四(RxBinding的使用)

總結

以上是生活随笔為你收集整理的RxJava 和 RxAndroid 三(生命周期控制和内存优化)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 在线天堂av | www.激情| 日本女人性视频 | 欧美丰满老熟妇aaaa片 | 三日本三级少妇三级99 | 91日韩欧美 | 亚洲精品美女网站 | 久久精品无码专区免费 | 成年人免费看毛片 | 碰碰97 | 国产探花视频在线观看 | 麻豆一区二区99久久久久 | 性感美女在线 | 日本高清不卡二区 | 九九精品热 | 91麻豆精品一区二区三区 | 天堂8在线| 四虎免费在线观看 | 免费国产一级 | 欧美激情18 | 日韩精品一线二线三线 | 亚洲天堂首页 | 欧美激情aaa | 特黄做受又粗又大又硬老头 | 精品国产九九九 | 嫩草影院在线观看视频 | 乱亲女h秽乱长久久久 | 国产裸体永久免费视频网站 | 日韩插 | 国产精品12页 | 五月天综合久久 | hs视频在线观看 | 国产系列精品av | 我的大叔| 九九这里只有精品视频 | 99人人爽 | 九九热这里有精品视频 | 男女污网站 | 久久国产香蕉 | 日本在线黄色 | 少妇视频| 久久99操 | 亚洲一区视频在线 | 射影院| 国产精品美女久久久久图片 | 日韩熟妇一区二区三区 | 中文字幕高清在线免费播放 | 麻豆亚洲精品 | 国产成人精品免高潮费视频 | 精品在线视频一区二区三区 | 九一精品在线 | 精品国产aⅴ麻豆 | 欧美国产一区二区三区 | 国产午夜视频 | 欧美在线视频一区二区三区 | 捆绑裸体绳奴bdsm亚洲 | 久久久1| 中文av一区二区 | 老司机av影院 | 人妻偷人精品一区二区三区 | 91成人免费在线观看视频 | 人妻熟女一区二区aⅴ水野 91在线观看视频 | 在线a毛片 | 亚洲精品aⅴ | wwwav网站| 亚洲欧美成人一区二区 | 亚洲AV无码久久精品国产一区 | 久久在线免费观看视频 | 青青青国产在线 | 国产专区一 | 动漫av网 | 国产第一精品 | 国产精选av| 99精品综合 | 日本成人小视频 | 国产人成视频在线观看 | 好男人www在线视频 我们的2018在线观看免费高清 | 亚洲第一区视频 | 在线免费看黄色 | 91看片黄 | 三级黄色在线视频 | 成人片片| 人妻少妇偷人精品久久性色 | a在线免费观看 | 在线免费91 | 亚洲一区有码 | 亚洲特黄一级片 | 人妻少妇偷人精品久久性色 | 无套内谢的新婚少妇国语播放 | 无码h黄肉3d动漫在线观看 | 偷偷操不一样的99 | 久久久久久久久久久电影 | 国产精品亚洲无码 | 123毛片| 蜜臀久久99精品久久久 | 欧美久操| 一区二区三区国产 | 91国产免费视频 | 欧美色图在线播放 |