RxJava Tips

本篇記錄公司項(xiàng)目用的RxJava遇到的問(wèn)題烙如,本篇持續(xù)更新!

極力推薦 RxJava 入門(mén)到精通文章https://github.com/THEONE10211024/RxJavaSamples

歡迎加群討論(158943444):

RxJava RxAndroid Retrofit RxBus Dragger2 OkHttp MVP MVVM DataBinding

1、防止內(nèi)存泄漏CompositeSubscription

使用CompositeSubscription可以防止RxJava帶來(lái)的內(nèi)存泄漏,因?yàn)橛肦x流的地方比較多,所以直接把CompositeSubscription放到BasePresenter中绳慎,方便快捷

  public class BasePresenter<T extends BaseView> implements Presenter<T>{    
    public CompositeSubscription mCompositeSubscription;    
    public T view;    
    @Override    
    public void attachView(T t) {        
      mCompositeSubscription = new CompositeSubscription();        
      view = t;    
    }    
    @Override    
    public void detachView() {        
      mCompositeSubscription.unsubscribe();        
      mCompositeSubscription = null;        
      view = null;    
    }    
    public T getView(){        
      return view;    
    }
  }

然后在每一個(gè)Presenter中,只要把用到的RxJava流加到CompositeSubscription里面就可以了 mCompositeSubscription.add(RxJava流)兔朦,這樣不用擔(dān)心RxJava帶來(lái)的內(nèi)存泄漏了偷线。

2、線程切換compose的使用

使用RxJava的都知道沽甥,線程切換時(shí)多么的優(yōu)雅声邦!
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())

但是每次都要這樣寫(xiě)也是挺煩的,用compose可以更優(yōu)雅的切換線程.
在Rx流的最后用 compose(RxUtils.applyIOToMainThreadSchedulers())
這一句代碼就可以切換了摆舟!

  public class RxUtils {    
    private staticObservable.TransformerioToMainThreadSchedulerTransformer;    
    private static Observable.Transformer newThreadToMainThreadSchedulerTransformer;    
    static {        
      ioToMainThreadSchedulerTransformer = createIOToMainThreadScheduler();        
      newThreadToMainThreadSchedulerTransformer = createNewThreadToMainThreadScheduler();
    }    
    private static <T> Observable.Transformer<T, T> createIOToMainThreadScheduler() {        
      return tObservable -> tObservable.subscribeOn(Schedulers.io())    
              .unsubscribeOn(Schedulers.computation())               
              .observeOn(AndroidSchedulers.mainThread());    
    }    
    public static <T> Observable.Transformer<T, T> applyIOToMainThreadSchedulers() {       
       return ioToMainThreadSchedulerTransformer;    
    }    
    private static <T> Observable.Transformer<T, T> createNewThreadToMainThreadScheduler(){        
        return tObservable -> tObservable.subscribeOn(Schedulers.newThread())               
        .unsubscribeOn(Schedulers.computation())               
        .unsubscribeOn(Schedulers.io())               
        .observeOn(AndroidSchedulers.mainThread());    
    }    
    public static <T> Observable.Transformer<T, T> applyNewThreadToMainThreadSchedulers(){        
      return newThreadToMainThreadSchedulerTransformer;   
   }
}

3亥曹、onErrorResumeNext的使用

情景:
當(dāng)我們請(qǐng)求數(shù)據(jù)的時(shí)候,先請(qǐng)求網(wǎng)絡(luò)上面的數(shù)據(jù)恨诱,沒(méi)有的話請(qǐng)求硬盤(pán)上面的數(shù)據(jù)媳瞪,并且想在同一個(gè)Rx流中處理這些操作.

方法:

使用onErrorResumeNext操作符,可以很好的完成上面的需求照宝,在網(wǎng)絡(luò)請(qǐng)求最后加上onErrorResumeNext(throwable -> getDisk())蛇受,這樣整個(gè)Rx流就不會(huì)結(jié)束,然后會(huì)轉(zhuǎn)到getDisk請(qǐng)求緩存數(shù)據(jù)的流中.

1厕鹃、如果不用onErrorResumeNext兢仰,當(dāng)網(wǎng)絡(luò)出問(wèn)題時(shí)候,請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)的流就會(huì)執(zhí)行OnError結(jié)束整個(gè)Rx流剂碴,然后我們必須在onError中在此發(fā)送請(qǐng)求緩存數(shù)據(jù)的Rx流把将,這樣比較麻煩了。

2忆矛、使用concat操作符察蹲,使用concat也是要等到請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)的Rx流執(zhí)行到OnError的時(shí)候,才能在次執(zhí)行請(qǐng)求緩存的Rx流催训,同樣比較麻煩.

不知道有沒(méi)有更好的方法洽议,如果有,希望留言漫拭,謝謝绞铃!

4、filter的一個(gè)錯(cuò)誤理解

由于沒(méi)有很好的理解filter嫂侍,以為filter過(guò)濾完所有數(shù)據(jù)(就是沒(méi)有得到自己想要的數(shù)據(jù))就會(huì)執(zhí)行subscribe的onError儿捧,其實(shí)正確的是 會(huì)直接執(zhí)行onComplete,然后整個(gè)流就結(jié)束了挑宠!
測(cè)試代碼:

  Observable.create(new Observable.OnSubscribe<Integer>() {    
    @Override    
    public void call(Subscriber<? super Integer> subscriber) {        
      subscriber.onNext(null);        
      subscriber.onCompleted();    
      }
    })
    .filter(integer -> integer != null)        
    .subscribeOn(Schedulers.io())        
    .observeOn(AndroidSchedulers.mainThread())        
    .subscribe(new Subscriber<Integer>() {            
        @Override            
        public void onCompleted() {                
          LogUtils.i("integer:");            
        }            
        @Override            
        public void onError(Throwable e) {                
          LogUtils.i("integer:" + e.getMessage());            
        }            
        @Override            
        public void onNext(Integer integer) {                
          LogUtils.i("integer:" + integer);            
        }        
    });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末菲盾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子各淀,更是在濱河造成了極大的恐慌懒鉴,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碎浇,死亡現(xiàn)場(chǎng)離奇詭異临谱,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)奴璃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)悉默,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人苟穆,你說(shuō)我怎么就攤上這事抄课。” “怎么了雳旅?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵跟磨,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我攒盈,道長(zhǎng)抵拘,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任型豁,我火速辦了婚禮僵蛛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘偷遗。我一直安慰自己墩瞳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布氏豌。 她就那樣靜靜地躺著喉酌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪泵喘。 梳的紋絲不亂的頭發(fā)上泪电,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音纪铺,去河邊找鬼相速。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鲜锚,可吹牛的內(nèi)容都是我干的突诬。 我是一名探鬼主播苫拍,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼旺隙!你這毒婦竟也來(lái)了绒极?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蔬捷,失蹤者是張志新(化名)和其女友劉穎垄提,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體周拐,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铡俐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了妥粟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片审丘。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖罕容,靈堂內(nèi)的尸體忽然破棺而出备恤,到底是詐尸還是另有隱情,我是刑警寧澤锦秒,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布露泊,位于F島的核電站,受9級(jí)特大地震影響旅择,放射性物質(zhì)發(fā)生泄漏惭笑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一生真、第九天 我趴在偏房一處隱蔽的房頂上張望沉噩。 院中可真熱鬧,春花似錦柱蟀、人聲如沸川蒙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)畜眨。三九已至,卻和暖如春术瓮,著一層夾襖步出監(jiān)牢的瞬間康聂,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工胞四, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恬汁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓辜伟,卻偏偏與公主長(zhǎng)得像氓侧,于是被迫代替她去往敵國(guó)和親脊另。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,304評(píng)論 25 707
  • http://blog.csdn.net/yyh352091626/article/details/5330472...
    奈何心善閱讀 3,563評(píng)論 0 0
  • 我從去年開(kāi)始使用 RxJava 甘苍,到現(xiàn)在一年多了尝蠕。今年加入了 Flipboard 后,看到 Flipboard 的...
    Jason_andy閱讀 5,493評(píng)論 7 62
  • 從我記事兒起廊佩,我與哥哥就是鎮(zhèn)上的名人囚聚,走在任何一個(gè)角落,我們身上就會(huì)被標(biāo)簽私生子标锄、賤骨頭一類(lèi)的貶義詞顽铸。 每每這樣,...
    愛(ài)吃西瓜的小哈利閱讀 1,009評(píng)論 0 0
  • 芍柚小姐: 祝安好料皇。 我不知你的筆名為何叫芍柚谓松,或許是因?yàn)槟悛?dú)愛(ài)芍藥花和柚子茶?但是第一次讀到你給我的評(píng)論践剂,就想開(kāi)...
    嫣然去雕飾閱讀 786評(píng)論 12 9