Observable.empty()和Observable.never()区别

1.引入问题

今天在做上传图片数组到服务器。服务器接受是一个图片一个图片的接受。图片上传完毕再调用另外一个接口上传json字符串。上传json字符串在complated方法中执行的。List保存的是 图片路径。图片上传到服务器代码如下。

 if (isNetworkAvailable()) {
        showLoadding("正在上传....",false);
        Observable.from(imagePath)
                .filter(s -> {
                    return StringUtil.isEmpty(s) ? false : true;
                })
                .flatMap((Func1>) s -> {
                    File file = new File(s);
                    return OkGo.post(XYApi.IP + XYApi.zacjUploadImage)
                            .tag("upload")
                            .params(file.getName(), file)
                            .getCall(StringConvert.create(), RxAdapter.create());//以上为产生请求事件,请求默认发生在IO线程
                    
                }).compose(this.bindToLifecycle())
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new XinYiSubscriber() {
                    @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>) s -> {
                       File file = new File(s);
                       return OkGo.post(XYApi.IP + XYApi.zacjUploadImage)
                               .tag("upload")
                               .params(file.getName(), file)
                               .getCall(StringConvert.create(), RxAdapter.create())//以上为产生请求事件,请求默认发生在IO线程
                               .onErrorResumeNext(throwable -> Observable.never());
                   }).

2.开始正题

上面的代码是我最开始写的。 在网络好的情况下,或者网络突然断掉的情况下,上面的代码可以进行。但是假如网络环境很差很差超级差。http能链接,但是发送数据包很缓慢很缓慢,以至于http超时机制无法执行。导致弹出框一直显示,即使等待20s也不会消失。于是查了查rxjava的中文文档,看完后还是不懂,故写了一个demo。

Observable.never()的例子:

 List 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>() {
                   @Override
                   public Observable call(Integer integer) {
                       if (integer == 3) {
                           return Observable.error(new Throwable());
                       } else {
                           return Observable.just(integer);
                       }
                   }
               }).onErrorResumeNext(new Func1>() {
           @Override
           public Observable call(Throwable throwable) {
               return Observable.never();
           }
       }).subscribe(new Subscriber() {

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

打印出来的结果是:

Observable.empty()和Observable.never()区别_第1张图片
1494588711(1).jpg

注意 用Oberable.never(); 发现此时flatmap中断了操作。没执行complated方法。没执行complated方法 也没执行donext,也没执行onEorror方法,导致加载框一直显示,无法消失。于是我使用Obserable.empty();

将上面的onErrorResumeNext 回调中的 return Observable.never(); 换成 return Observable.empty(); 运行结果如下图所示:

![B7F)HPDF)J9S(((W8X8646.jpg

发现使用Observable.empty().能执行complated方法,但是遇到错误就不会向后执行了。也不满足。查阅了rxjava 文档。没看到支持执行了错误方法 依旧继续发送的api。所以写下这个文章 寻求答案。当前是使用的Obserable.empty().

你可能感兴趣的:(Observable.empty()和Observable.never()区别)