RxJava2 實戰(zhàn)知識梳理(2) - 計算一段時間內(nèi)數(shù)據(jù)的平均值

RxJava2 實戰(zhàn)系列文章

RxJava2 實戰(zhàn)知識梳理(1) - 后臺執(zhí)行耗時操作,實時通知 UI 更新
RxJava2 實戰(zhàn)知識梳理(2) - 計算一段時間內(nèi)數(shù)據(jù)的平均值
RxJava2 實戰(zhàn)知識梳理(3) - 優(yōu)化搜索聯(lián)想功能
RxJava2 實戰(zhàn)知識梳理(4) - 結(jié)合 Retrofit 請求新聞資訊
RxJava2 實戰(zhàn)知識梳理(5) - 簡單及進(jìn)階的輪詢操作
RxJava2 實戰(zhàn)知識梳理(6) - 基于錯誤類型的重試請求
RxJava2 實戰(zhàn)知識梳理(7) - 基于 combineLatest 實現(xiàn)的輸入表單驗證
RxJava2 實戰(zhàn)知識梳理(8) - 使用 publish + merge 優(yōu)化先加載緩存掸茅,再讀取網(wǎng)絡(luò)數(shù)據(jù)的請求過程
RxJava2 實戰(zhàn)知識梳理(9) - 使用 timer/interval/delay 實現(xiàn)任務(wù)調(diào)度
RxJava2 實戰(zhàn)知識梳理(10) - 屏幕旋轉(zhuǎn)導(dǎo)致 Activity 重建時恢復(fù)任務(wù)
RxJava2 實戰(zhàn)知識梳理(11) - 檢測網(wǎng)絡(luò)狀態(tài)并自動重試請求
RxJava2 實戰(zhàn)知識梳理(12) - 實戰(zhàn)講解 publish & replay & share & refCount & autoConnect
RxJava2 實戰(zhàn)知識梳理(13) - 如何使得錯誤發(fā)生時不自動停止訂閱關(guān)系
RxJava2 實戰(zhàn)知識梳理(14) - 在 token 過期時卑笨,刷新過期 token 并重新發(fā)起請求
RxJava2 實戰(zhàn)知識梳理(15) - 實現(xiàn)一個簡單的 MVP + RxJava + Retrofit 應(yīng)用


一、前言

今天夭拌,我們繼續(xù)跟著 RxJava-Android-Samples 的腳步,一起看一下RxJava2在實戰(zhàn)當(dāng)中的應(yīng)用,在這個項目中,第二個的例子的描述如下:


簡單地翻譯過來:如果在2s內(nèi)連續(xù)點擊了一個按鈕五次音羞,那么我們只會收到一個“你點擊了該按鈕五次”的時間,而不是五個"你點擊了該按鈕"的事件仓犬。這個示例的目的是讓我們學(xué)會如何應(yīng)用buffer操作符嗅绰。

二、示例

2.1 應(yīng)用場景

仔細(xì)思考了一下搀继,在平時的項目中窘面,我們似乎不會遇到需要統(tǒng)計一段時間內(nèi)用戶點擊了多少次按鈕這種需求。

但是叽躯,我們有時候會需要計算一段時間內(nèi)的平均數(shù)據(jù)民镜,例如統(tǒng)計一段時間內(nèi)的平均溫度,或者統(tǒng)計一段時間內(nèi)的平均位置险毁。在接觸RxJava之前制圈,我們一般會將這段時間內(nèi)統(tǒng)計到的數(shù)據(jù)都暫時存起來们童,等到需要更新的時間點到了之后,再把這些數(shù)據(jù)結(jié)合起來鲸鹦,計算這些數(shù)據(jù)的平均值慧库。

現(xiàn)在,我們就來看一下馋嗜,用RxJava2如何去實現(xiàn)這個需求齐板。

2.2 示例代碼

這里,我們通過一個Handler循環(huán)地發(fā)送消息葛菇,實現(xiàn)間隔一定時間進(jìn)行溫度的測量甘磨,但是在測量之后,我們并不實時地更新界面的溫度顯示眯停,而是每隔3s統(tǒng)計一次過去這段時間內(nèi)的平均溫度济舆。

public class BufferActivity extends AppCompatActivity {

    private PublishSubject<Double> mPublishSubject;
    private CompositeDisposable mCompositeDisposable;
    private TextView mTv;
    private SourceHandler mSourceHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_buffer);
        mTv = (TextView) findViewById(R.id.tv_buffer);
        mPublishSubject = PublishSubject.create();
        DisposableObserver<List<Double>> disposableObserver = new DisposableObserver<List<Double>>() {
            @Override
            public void onNext(List<Double> o) {
                double result = 0;
                if (o.size() > 0) {
                    for (Double d : o) {
                        result += d;
                    }
                    result = result / o.size();
                }
                Log.d("BufferActivity", "更新平均溫度:" + result);
                mTv.setText("過去3秒收到了" + o.size() + "個數(shù)據(jù), 平均溫度為:" + result);
            }

            @Override
            public void onError(Throwable throwable) {

            }

            @Override
            public void onComplete() {

            }
        };
        mPublishSubject.buffer(3000, TimeUnit.MILLISECONDS).observeOn(AndroidSchedulers.mainThread()).subscribe(disposableObserver);
        mCompositeDisposable = new CompositeDisposable();
        mCompositeDisposable.add(disposableObserver);
        //開始測量溫度莺债。
        mSourceHandler = new SourceHandler();
        mSourceHandler.sendEmptyMessage(0);
    }

    public void updateTemperature(double temperature) {
        Log.d("BufferActivity", "溫度測量結(jié)果:" + temperature);
        mPublishSubject.onNext(temperature);
    }

    private class SourceHandler extends Handler {

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            double temperature = Math.random() * 25 + 5;
            updateTemperature(temperature);
            //循環(huán)地發(fā)送滋觉。
            sendEmptyMessageDelayed(0, 250 + (long) (250 * Math.random()));
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mSourceHandler.removeCallbacksAndMessages(null);
        mCompositeDisposable.clear();

    }
}

實際的運行結(jié)果為:



控制臺輸出的信息為:


三、示例解析

3.1 原理

在上面的例子中齐邦,我們使用了buffer(int time, Unit timeUnit)椎侠,其原理圖如下所示:


函數(shù)中的兩個形參分別對應(yīng)是時間的值和單位,這樣措拇,當(dāng)我們通過下面這句發(fā)送事件:

mPublishSubject.onNext(temperature);

事件并不會直接傳遞到ObserveronNext方法中我纪,而是放在緩沖區(qū)中,直到事件到之后丐吓,再將所有在這段緩沖事件內(nèi)放入緩沖區(qū)中的值宣羊,放在一個List中一起發(fā)送到下游。

3.2 Buffer 的其它用法

關(guān)于Buffer的其它用法汰蜘,這篇文章寫得很全仇冯,我這里就不詳細(xì)贅述了,大家可以參考:RxJava 的學(xué)習(xí)之變換操作符 - Buffer族操。

四苛坚、參考文獻(xiàn)

RxJava 的學(xué)習(xí)之變換操作符 - Buffer


更多文章,歡迎訪問我的 Android 知識梳理系列:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末色难,一起剝皮案震驚了整個濱河市泼舱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枷莉,老刑警劉巖娇昙,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異笤妙,居然都是意外死亡冒掌,警方通過查閱死者的電腦和手機(jī)噪裕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來股毫,“玉大人膳音,你說我怎么就攤上這事×逦埽” “怎么了祭陷?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長趣席。 經(jīng)常有香客問我兵志,道長,這世上最難降的妖魔是什么宣肚? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任想罕,我火速辦了婚禮,結(jié)果婚禮上钉寝,老公的妹妹穿的比我還像新娘。我一直安慰自己闸迷,他們只是感情好嵌纲,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腥沽,像睡著了一般逮走。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上今阳,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天师溅,我揣著相機(jī)與錄音,去河邊找鬼盾舌。 笑死墓臭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的妖谴。 我是一名探鬼主播窿锉,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼膝舅!你這毒婦竟也來了嗡载?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仍稀,失蹤者是張志新(化名)和其女友劉穎洼滚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體技潘,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡遥巴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年千康,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挪哄。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡吧秕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出迹炼,到底是詐尸還是另有隱情砸彬,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布斯入,位于F島的核電站砂碉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏刻两。R本人自食惡果不足惜增蹭,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望磅摹。 院中可真熱鬧滋迈,春花似錦、人聲如沸户誓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帝美。三九已至碍彭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悼潭,已是汗流浹背庇忌。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留舰褪,地道東北人皆疹。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像占拍,于是被迫代替她去往敵國和親墙基。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

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