RxJava學(xué)習(xí)筆記 -- 第一個Observable

注:本文摘自《RxJava Essentials》翻譯中文版電子書

開頭

引用的例子:檢索安裝的應(yīng)用列表并填充RecycleView的item來展示它們:

private Observable<AppInfo> getApps(){
    return Observable.create(subscriber -> {
        List<AppInfoRich> apps = new ArrayList<AppInfoRich>();

        final Intent mainIntent = new Intent(Intent.ACTION_MAIN,null);
        mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);

        List<ResolveInfo> infos = getActivity().getPackageManager().queryIntentActivities(mainIntent, 0);

        for(ResolveInfo info : infos){
            apps.add(new AppInfoRich(getActivity(),info));
        }

        for (AppInfoRich appInfo:apps) {
            Bitmap icon = Utils.drawableToBitmap(appInfo.getIcon());
            String name = appInfo.getName();
            String iconPath = mFilesDir + "/" + name;
            Utils.storeBitmap(App.instance, icon,name);
    
            if (subscriber.isUnsubscribed()){
                return;
            }
            subscriber.onNext(new AppInfo(name,iconPath,appInfo.getLastUpdateTime()));                
        }
        if (!subscriber.isUnsubscribed()){
            subscriber.onCompleted();
        }
    });
}

重點注意的是在發(fā)射新的數(shù)據(jù)( subscriber.onNext())或者完成序列之前( subscriber.onCompleted())要檢測觀察者的訂閱情況乏矾。這樣的話代碼會更高效蝶棋,因為如果沒有觀察者等待時我們就不生成沒有必要的數(shù)據(jù)項顽聂。

from()

如果希望Observable發(fā)射的是整個list,那么可以這樣做:

mApps = ApplicationsList.getInstance().getList();
private void loadList(List<AppInfo> apps) {
    Observable.from(apps).subscribe(/**代碼省略**/);
}

just()

假如我們只有3個獨立的AppInfo對象并且我們想把他們轉(zhuǎn)化為Observable并填充到RecyclerView的item中:

private void loadApps(AppInfo appOne,AppInfo appTwo,AppInfo appThree) {
    Observable.just(appOne,appTwo,appThree).subscribe(/**代碼省略**/);
}

你可以將一個函數(shù)作為參數(shù)傳給just()方法博其,你將會得到一個已存在代碼的原始Observable版本。在一個新的響應(yīng)式架構(gòu)的基礎(chǔ)上遷移已存在的代碼立肘。

repeat()

假如你想對一個Observable重復(fù)發(fā)射三次數(shù)據(jù):

private void loadApps(AppInfo appOne,AppInfo appTwo,AppInfo appThree) {
    Observable.just(appOne,appTwo,appThree)
            .repeat(3)
            .subscribe(/**代碼省略**/);
}

我們在just()創(chuàng)建Observable后追加了repeat(3)铲球,它將會創(chuàng)建9個元素的序列,每一個都單獨發(fā)射谁尸。

defer()

有這樣一個場景舅踪,你想在這聲明一個Observable但是你又想推遲這個Observable的創(chuàng)建直到觀察者訂閱時×悸看下面的getInt()函數(shù):

private Observable<Integer> getInt(){
    return Observable.create(subscriber -> {
        if(subscriber.isUnsubscribed()){
            return;
        }
        App.L.debug("GETINT");
        subscriber.onNext(42);
        subscriber.onCompleted();
    });
}

這比較簡單抽碌,并且它沒有做太多事情,但是它正好為我們服務(wù)【鐾現(xiàn)在货徙,我們可以創(chuàng)建一個新的Observable并且應(yīng)用defer():

Observable<Integer> deferred = Observable.defer(this::getInt);

這次左权,deferred存在,但是getInt() create()方法還沒有調(diào)用:logcat日志也沒有“GETINT”打印出來:

deferred.subscribe(number -> {
    App.L.debug(String.valueOf(number));
});

但是一旦我們訂閱了痴颊,create()方法就會被調(diào)用并且我們也可以在logcat日志中得到下賣弄兩個:GETINT和42赏迟。

range()

如果需要從一個指定的數(shù)字X開始發(fā)射N個數(shù)字,可以用它:

Observable.range(10,3).subscribe(/**代碼省略**/);

range()函數(shù)用兩個數(shù)字作為參數(shù):第一個是起始點祷舀,第二個是我們想發(fā)射數(shù)字的個數(shù)瀑梗。

interval()

interval()函數(shù)在你需要創(chuàng)建一個輪詢程序時非常好用。

Subscription stopMePlease = Observable.interval(3,TimeUnit.SECONDS)
    .subscribe(/**代碼省略**/);

interval()函數(shù)的兩個參數(shù):一個指定兩次發(fā)射的時間間隔裳扯,另一個是用到的時間單位抛丽。

timer()

如果你需要一個一段時間之后才發(fā)射的Observable,你可以像下面的例子使用timer():

Observable.timer(3,TimeUnit.SECONDS)
    .subscribe(/**代碼省略**/);

它將3秒后發(fā)射0,然后就完成了饰豺。讓我們使用timer()的第三個參數(shù)亿鲜,就像下面的例子:

Observable.timer(3,3,TimeUnit.SECONDS)
    .subscribe(/**代碼省略**/);

用這個代碼,你可以創(chuàng)建一個以初始值來延遲執(zhí)行的interval()版本冤吨,然后每隔N秒就發(fā)射一個新的數(shù)字蒿柳。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市漩蟆,隨后出現(xiàn)的幾起案子垒探,更是在濱河造成了極大的恐慌,老刑警劉巖怠李,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圾叼,死亡現(xiàn)場離奇詭異,居然都是意外死亡捺癞,警方通過查閱死者的電腦和手機(jī)夷蚊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來髓介,“玉大人惕鼓,你說我怎么就攤上這事√拼。” “怎么了箱歧?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長一膨。 經(jīng)常有香客問我呀邢,道長,這世上最難降的妖魔是什么汞幢? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮微谓,結(jié)果婚禮上森篷,老公的妹妹穿的比我還像新娘输钩。我一直安慰自己,他們只是感情好仲智,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布买乃。 她就那樣靜靜地躺著,像睡著了一般钓辆。 火紅的嫁衣襯著肌膚如雪剪验。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天前联,我揣著相機(jī)與錄音功戚,去河邊找鬼。 笑死似嗤,一個胖子當(dāng)著我的面吹牛啸臀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播烁落,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼乘粒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伤塌?” 一聲冷哼從身側(cè)響起灯萍,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎每聪,沒想到半個月后旦棉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡熊痴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年他爸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片果善。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡诊笤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出巾陕,到底是詐尸還是另有隱情讨跟,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布鄙煤,位于F島的核電站晾匠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏梯刚。R本人自食惡果不足惜凉馆,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧澜共,春花似錦向叉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至京革,卻和暖如春奇唤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匹摇。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工咬扇, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人来惧。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓冗栗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親供搀。 傳聞我的和親對象是個殘疾皇子隅居,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348

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

  • 注:只包含標(biāo)準(zhǔn)包中的操作符,用于個人學(xué)習(xí)及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 2,186評論 2 8
  • 響應(yīng)式編程簡介 響應(yīng)式編程是一種基于異步數(shù)據(jù)流概念的編程模式葛虐。數(shù)據(jù)流就像一條河:它可以被觀測胎源,被過濾,被操作屿脐,或者...
    說碼解字閱讀 3,058評論 0 5
  • 作者: maplejaw本篇只解析標(biāo)準(zhǔn)包中的操作符涕蚤。對于擴(kuò)展包,由于使用率較低的诵,如有需求万栅,請讀者自行查閱文檔。 創(chuàng)...
    maplejaw_閱讀 45,630評論 8 93
  • RxJava正在Android開發(fā)者中變的越來越流行西疤。唯一的問題就是上手不容易烦粒,尤其是大部分人之前都是使用命令式編...
    劉啟敏閱讀 1,849評論 1 7
  • 本篇文章介主要紹RxJava中操作符是以函數(shù)作為基本單位,與響應(yīng)式編程作為結(jié)合使用的代赁,對什么是操作扰她、操作符都有哪些...
    嘎啦果安卓獸閱讀 2,851評論 0 10