1.引入问题
今天在做上传图片数组到服务器。服务器接受是一个图片一个图片的接受。图片上传完毕再调用另外一个接口上传json字符串。上传json字符串在complated方法中执行的。List<String>保存的是 图片路径。图片上传到服务器代码如下。
if (isNetworkAvailable()) {
showLoadding("正在上传....",false);
Observable.from(imagePath)
.filter(s -> {
return StringUtil.isEmpty(s) ? false : true;
})
.flatMap((Func1<String, Observable<?>>) s -> {
File file = new File(s);
return OkGo.post(XYApi.IP + XYApi.zacjUploadImage)
.tag("upload")
.params(file.getName(), file)
.getCall(StringConvert.create(), RxAdapter.<String>create());//以上为产生请求事件,请求默认发生在IO线程
}).compose(this.bindToLifecycle())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new XinYiSubscriber<Object>() {
@Override
public void doError(Throwable e) {
stopLoading();
ToastUtil.showShort(getApplicationContext(),"上传失败");
imagePath.clear();
}
@Override
public void doNext(Object o) {
}
@Override
public void onCompleted() {
uploadTextInfor();//调用另外一个方法上传数据
super.onCompleted();
}
});
}else {
ToastUtil.showShort(getApplicationContext(),"网络异常");
}
}
在网络正常的情况下:上面的代码能满足上传图片数组到服务器。。但是假如网络情况不好。上传9张图片,其中俩张上传失败,还能不能继续上传呢。答案是否定的。通过flatMap操作符得到Obserable。假如其中上传错误了 就会直接执行onError方法。如何解决这个问题。就涉及到Rxjava的错误处理。该节提供了一些列操作来解决上面说到的这个问题。。错误处理机制详细不多说。主要是在flatmap操作符中 ,加入错误处理操作符。
.flatMap((Func1<String, Observable<?>>) s -> {
File file = new File(s);
return OkGo.post(XYApi.IP + XYApi.zacjUploadImage)
.tag("upload")
.params(file.getName(), file)
.getCall(StringConvert.create(), RxAdapter.<String>create())//以上为产生请求事件,请求默认发生在IO线程
.onErrorResumeNext(throwable -> Observable.never());
}).
2.开始正题
上面的代码是我最开始写的。 在网络好的情况下,或者网络突然断掉的情况下,上面的代码可以进行。但是假如网络环境很差很差超级差。http能链接,但是发送数据包很缓慢很缓慢,以至于http超时机制无法执行。导致弹出框一直显示,即使等待20s也不会消失。于是查了查rxjava的中文文档,看完后还是不懂,故写了一个demo。
Observable.never()的例子:
List<Integer> mlist = new ArrayList<>();
mlist.add(1);
mlist.add(2);
mlist.add(3);
mlist.add(4);
mlist.add(5);
mlist.add(6);
Observable.from(mlist)
.flatMap(new Func1<Integer, Observable<?>>() {
@Override
public Observable<?> call(Integer integer) {
if (integer == 3) {
return Observable.error(new Throwable());
} else {
return Observable.just(integer);
}
}
}).onErrorResumeNext(new Func1<Throwable, Observable<?>>() {
@Override
public Observable<?> call(Throwable throwable) {
return Observable.never();
}
}).subscribe(new Subscriber<Object>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
@Override
public void onError(Throwable e) {
System.out.println("onError");
}
@Override
public void onNext(Object o) {
System.out.println(Integer.valueOf(o.toString()));
}
});
}
打印出来的结果是:
注意 用Oberable.never(); 发现此时flatmap中断了操作。没执行complated方法。没执行complated方法 也没执行donext,也没执行onEorror方法,导致加载框一直显示,无法消失。于是我使用Obserable.empty();
将上面的onErrorResumeNext 回调中的 return Observable.never(); 换成 return Observable.empty(); 运行结果如下图所示:
发现使用Observable.empty().能执行complated方法,但是遇到错误就不会向后执行了。也不满足。查阅了rxjava 文档。没看到支持执行了错误方法 依旧继续发送的api。所以写下这个文章 寻求答案。当前是使用的Obserable.empty().