RxJava 學(xué)習(xí)進行時&實際運用-Buffer&Interval

RX

1. buffer

詳見

Buffer官方介紹
操作符將一個Observable變換為另一個共啃,原來的Observable正常發(fā)射數(shù)據(jù)环戈,變換產(chǎn)生的Observable發(fā)射這些數(shù)據(jù)的緩存集合次和。Buffer
操作符在很多語言特定的實現(xiàn)中有很多種變體裙士,它們在如何緩存這個問題上存在區(qū)別。

  • buffer(int count)
    緩存一定數(shù)量的信息后才打包一起發(fā)送,打包后是以List<T>的形式發(fā)送米丘。

  • buffer(int count ,int skip)
    緩存一定數(shù)量的信息后才打包一起發(fā)送蚕甥,其中可以設(shè)定下一次的緩存開始位置,打包后是以List<T>的形式發(fā)送炕舵。

測試代碼:構(gòu)建一個String數(shù)組何之,發(fā)布者(Observable)的行為是緩存 count 個消息并打包發(fā)送,訂閱者的行為是接受每個發(fā)送來的List并打印咽筋。

//數(shù)據(jù)源
String[] strs = {"a","b","c","d","e","f","g","h","i"};
//發(fā)布者
Observable<String> origin = Observable.from(strs);
//訂閱者
Subscriber<String> sub = new Subscriber<String>() {
      @Override
      public void onCompleted() {
           Log.d("log", "Completed");
      }

       @Override
       public void onError(Throwable e) {
            Log.d("log", "Error");
       }

       @Override
       public void onNext(String s) {
            Log.d("log", "Next--------");
            for (int i = 0 ; i < s.size();i++){
                 Log.d("log", s.get(i));
            }
        }
};
  • count=2,skip=1
origin.buffer(2,1).subscribe(sub);
result

可見是緩存兩個信息溶推,并且打包發(fā)出,而且下一次的緩存位置是在當(dāng)前緩存隊列的第1位(指的是下標)開始。

  • count=2,skip=2
origin.buffer(2,2).subscribe(sub);

result

同樣是緩存了兩個信息蒜危,而下一次的緩存開始位置是在隊列的第2位(指的是下標虱痕,說明一下,這里的隊列是當(dāng)前還未發(fā)送的信息的隊列辐赞,之前已經(jīng)發(fā)送的是不算的

  • count=2,skip=3
origin.buffer(2,3).subscribe(sub);
result

c沒了部翘,f也沒了,i同樣消失了响委!

  • 示意圖新思,幫助理解
    示意圖.png

    感覺buffer(int count ,int skip)不如buffer(int count ,int nextHead)好理解呢。

2. interval

詳見

簡介的官方介紹晃酒,簡單卻實用
創(chuàng)建一個按固定時間間隔發(fā)射整數(shù)序列的Observable

  • interval(long interval,TimeUnit timeunit)
  • interval(long delay,long interval,TimeUnit timeunit)

之前寫倒計時的控件都是用Handler或者Timer去做的表牢,現(xiàn)在有這個就可以很方便的寫出倒計時控件,下面是我寫的一個倒計時按鈕贝次。
可以看到里面倒計時時數(shù)字有抖動崔兴,是模擬器的問題,在真機上是不會的(親測)蛔翅。

e1.gif
e2.gif
/**
 * Created by ZhengHy on 2016/6/30 0030.
 * 倒計時Button
 */

public class CountDownButton extends Button{
    /**
     * 默認倒計時時間
     */
    private final int DEFAULT_COUNT = 60;

    /**
     * 倒計時時間
     */
    private int iTotalCount = DEFAULT_COUNT;

    private int iCountingNum = DEFAULT_COUNT;

    /**
     * 默認開始顯示的字符串
     */
    private final String DEFAULT_START_STR = "開始";

    /**
     * 開始顯示的字符串
     */
    private String sStartStr = DEFAULT_START_STR;

    /**
     * 等待顏色
     */
    private int normalColor = 0xffff4000;

    /**
     * 倒計時顏色
     */
    private int countingColor = 0xffffffff;

    /**
     * 倒計時訂閱者
     */
    private Subscriber<Long> countDownTimer;


    public CountDownButton(Context context) {
        super(context);
        init();
    }

    public CountDownButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CountDownButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        onPre();
    }

    public int getiTotalCount() {
        return iTotalCount;
    }

    public void setiTotalCount(int iTotalCount) {
        this.iTotalCount = iTotalCount;
        this.iCountingNum = iTotalCount;
    }

    /**
     * 開始倒計時
     */
    public void countDown() {
        initTimer();
        onCounting();
        Observable.interval(0, 1, TimeUnit.SECONDS)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(countDownTimer);

    }

    private void initTimer() {
        countDownTimer = new Subscriber<Long>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Long aLong) {
                iCountingNum--;

                setText(iCountingNum + "");
                if (iCountingNum == 0l) {
                    countDownTimer.unsubscribe();
                    setClickable(true);
                    onPre();

                }
            }
        };
    }

    /**
     * 停止倒計時 恢復(fù)成最初樣子
     */
    public void shutDown() {
        if (countDownTimer != null) {
            countDownTimer.unsubscribe();
            onPre();
        }
    }

    private void onPre() {
        setClickable(true);
        iCountingNum = iTotalCount;
        setText(sStartStr);
        setTextColor(normalColor);
    }

    private void onCounting() {
        setClickable(false);
        setTextColor(countingColor);
    }
}

頁面布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <Button
        android:text="shutdown"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/cdb"
        android:layout_alignEnd="@+id/cdb"
        android:layout_marginTop="20dp"
        android:id="@+id/btn" />

    <network.scau.com.countdownbuttondemo.CountDownButton
        android:background="#ff000000"
        android:id="@+id/cdb"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:gravity="center"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />
</RelativeLayout>

MainActivity敲茄,使用ButterKnife注入控件
public class MainActivity extends AppCompatActivity {

    @Bind(R.id.btn)
    Button btn;

    @Bind(R.id.cdb)
    CountDownButton cdb;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
    }

    @OnClick(R.id.cdb)
    public void countting() {
        Toast.makeText(this,"countting",Toast.LENGTH_LONG).show();
        cdb.countDown();

    }

    @OnClick(R.id.btn)
    public void shutdown(){
        Toast.makeText(this,"shutdown",Toast.LENGTH_LONG).show();
        cdb.shutDown();
    }
}


有趣的Rx。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末山析,一起剝皮案震驚了整個濱河市堰燎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌笋轨,老刑警劉巖秆剪,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異爵政,居然都是意外死亡仅讽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門钾挟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洁灵,“玉大人,你說我怎么就攤上這事掺出』涨В” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵汤锨,是天一觀的道長双抽。 經(jīng)常有香客問我,道長闲礼,這世上最難降的妖魔是什么牍汹? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任琅翻,我火速辦了婚禮,結(jié)果婚禮上柑贞,老公的妹妹穿的比我還像新娘。我一直安慰自己聂抢,他們只是感情好钧嘶,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著琳疏,像睡著了一般有决。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上空盼,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天书幕,我揣著相機與錄音,去河邊找鬼揽趾。 笑死台汇,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的篱瞎。 我是一名探鬼主播苟呐,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼俐筋!你這毒婦竟也來了牵素?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤澄者,失蹤者是張志新(化名)和其女友劉穎笆呆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粱挡,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡赠幕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了抱怔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劣坊。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖屈留,靈堂內(nèi)的尸體忽然破棺而出局冰,到底是詐尸還是另有隱情,我是刑警寧澤灌危,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布康二,位于F島的核電站,受9級特大地震影響勇蝙,放射性物質(zhì)發(fā)生泄漏沫勿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望产雹。 院中可真熱鬧诫惭,春花似錦、人聲如沸蔓挖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘟判。三九已至怨绣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拷获,已是汗流浹背篮撑。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留匆瓜,地道東北人赢笨。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像驮吱,于是被迫代替她去往敵國和親质欲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

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

  • 作者: maplejaw本篇只解析標準包中的操作符糠馆。對于擴展包嘶伟,由于使用率較低,如有需求又碌,請讀者自行查閱文檔九昧。 創(chuàng)...
    maplejaw_閱讀 45,668評論 8 93
  • 注:只包含標準包中的操作符,用于個人學(xué)習(xí)及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 2,195評論 2 8
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理毕匀,服務(wù)發(fā)現(xiàn)铸鹰,斷路器,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • 本文基于 RxJava1.x 版本皂岔,閱讀本文前請先了解 RxJava[https://github.com/Rea...
    StoneHui閱讀 2,990評論 2 18
  • 某日聊天躁垛,說起找對象應(yīng)該找個把你當(dāng)女兒養(yǎng)的剖毯,愛你疼你寵你,最好不過教馆。當(dāng)時逊谋,眾人都深以為然,待回過味來土铺,總想著可以就...
    lucy大人閱讀 854評論 4 50