服务器的轮询操作
- 比如向服务器获取短信验证码
public void getMsgCodeWithRetry(String token ,String projectId,String phone)
{
EmaMsgModel emaMsgModel = new EmaMsgModel();
Observable.interval(5,TimeUnit.SECONDS)
.take(11)
.flatMap(new Func1<Long, Observable<String>>() {
@Override
public Observable<String> call(Long aLong) {
Log.v(TAG,"flatMap:" + String.valueOf(aLong));
if(aLong == 10)
{
throw new RuntimeException("获取验证码超过十次了");
}
return emaMsgModel.getMsgCode_EMA(token,projectId,phone);
}
})
.takeUntil(new Func1<String, Boolean>() {
@Override
public Boolean call(String s) {
Log.v(TAG,"takeUntil:" + s);
return !s.contains("False");
}
})
.filter(new Func1<String, Boolean>() {
@Override
public Boolean call(String s) {
Log.v(TAG,"filter:" + s);
return !s.contains("False");
}
})
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.v(TAG,"Action1:" + s);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Log.v(TAG,throwable.getMessage());
throwable.printStackTrace();
}
}, new Action0() {
@Override
public void call() {
Log.v(TAG,"onComplete");
}
});
}
执行结果
12-06 05:54:59.936 21790-21892/com.lt.accesstask V/MainActivity: flatMap:0
12-06 05:55:00.176 21790-21892/com.lt.accesstask V/MainActivity: filter:False:没有短信,请5秒后再试
12-06 05:55:00.176 21790-21892/com.lt.accesstask V/MainActivity: takeUntil:False:没有短信,请5秒后再试
12-06 05:55:04.934 21790-21892/com.lt.accesstask V/MainActivity: flatMap:1
12-06 05:55:05.288 21790-21892/com.lt.accesstask V/MainActivity: filter:False:没有短信,请5秒后再试
12-06 05:55:05.288 21790-21892/com.lt.accesstask V/MainActivity: takeUntil:False:没有短信,请5秒后再试
......
12-06 05:55:44.935 21790-21892/com.lt.accesstask V/MainActivity: flatMap:9
12-06 05:55:45.118 21790-21892/com.lt.accesstask V/MainActivity: filter:False:没有短信,请5秒后再试
12-06 05:55:45.118 21790-21892/com.lt.accesstask V/MainActivity: takeUntil:False:没有短信,请5秒后再试
12-06 05:55:49.937 21790-21892/com.lt.accesstask V/MainActivity: flatMap:10
12-06 05:55:49.948 21790-21892/com.lt.accesstask V/MainActivity: 获取验证码超过十次了
12-06 05:55:49.950 21790-21892/com.lt.accesstask W/System.err: at com.lt.accesstask.MainActivity$1.call(MainActivity.java:107)
12-06 05:55:49.951 21790-21892/com.lt.accesstask W/System.err: at com.lt.accesstask.MainActivity$1.call(MainActivity.java:102)
打印一组数据,可以指定间隔时间
可以将该数据打包在一个数据中,用interval和take操作符进行打印。
批量下载多个任务
- 比如同时下载七八个文件,下载完成之后MD5检验,转存