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);
}
});
}