Rxjava的interval操作符


title: Rxjava的interval操作符
date: 2016-12-13 10:33:27
tags: Utils


  • 有個需求重復發送,當然用timer、handler都行啦,不過要優雅還是得用rxjava啊

小demo,一個progressDialog進度條遞增,漲到100,進度條消失,如下所示

private ProgressDialog pd;
    private void download() {
        if (pd == null) {
            pd = new ProgressDialog(this);
            pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            pd.setTitle("download new version");
            pd.setProgress(0);
            pd.setCanceledOnTouchOutside(false);

        }
        pd.show();
      //每100ms發送一次,進度遞增為1,max不設置的話默認是100
        Observable.interval(100, TimeUnit.MILLISECONDS)
                  .subscribe(new Observer<Long>() {
                    @Override
                    public void onCompleted() {
                            pd.setProgress(0);
                            pd.dismiss();
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(Long aLong) {
                        pd.setProgress(pd.getProgress() + 1);
                    }
                });
    }

爽不爽! 爽的根本停不下來!沒錯停不下來了。。。

所以要用到take操作符,這里需求是讓進度條到達max就停止發送,所以用的是takeUtil

private ProgressDialog pd;
    private void download() {
        if (pd == null) {
            pd = new ProgressDialog(this);
            pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            pd.setTitle("download new version");
            pd.setProgress(0);
            pd.setCanceledOnTouchOutside(false);

        }
        pd.show();
        Observable.interval(100, TimeUnit.MILLISECONDS)
                .takeUntil(new Func1<Long, Boolean>() {
                    @Override
                    public Boolean call(Long aLong) {
                      //當進度條與max相同就停止發送
                        return pd.getProgress() == pd.getMax();
                    }
                })
                .subscribe(new Observer<Long>() {
                    @Override
                    public void onCompleted() {
                      //結束的時候將進度條清0,并且消失
                        pd.setProgress(0);
                        pd.dismiss();
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(Long aLong) {
                        pd.setProgress(pd.getProgress() + 1);
                    }
                });
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容