Android RxJava 处理生产者返回多种状态转换到消费者只有两种状态的方式

1.场景

比如用户需要在子线程中网络请求,返回可能是请求出错,也可能是请求成功返回的状态码为失败,同时可能返回成功不是自己想要的内容,此时需要告诉那些观察者两种状态:要么成功,要么失败!

2.看一段代码

这种后面拿不到返回值,很烦!

Single.just(curData).map(new Func1<PhotoData, Observable<String>>() {
                @Override
                public Observable<String> call(PhotoData photoData) {
                    String dbCachePath = getDbCachePath(photoData);
                    if(TextUtils.isEmpty(dbCachePath)){
                        return Observable.error(new Exception("dbCachePath is null"));
                    }else {
                        return Observable.just(dbCachePath);
                    }
                }
            })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new SingleSubscriber<Observable<String>>() {
                @Override
                public void onSuccess(Observable<String> value) {

                }

                @Override
                public void onError(Throwable error) {

                }
            });

 第二种推荐:

Single.create(new Single.OnSubscribe<String>() {
                @Override
                public void call(SingleSubscriber<? super String> singleSubscriber) {
                    String dbCachePath = getDbCachePath(fileName);
                    if(TextUtils.isEmpty(dbCachePath)){
                        singleSubscriber.onSuccess(dbCachePath);
                    }else {
                        singleSubscriber.onError(new Exception("dbCachePath is null"));
                    }
                }
            })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new SingleSubscriber<String>() {
                @Override
                public void onSuccess(String value) {
                    
                }

                @Override
                public void onError(Throwable error) {

                }
            });

3.总结

思想:在生产数据(网络请求,db操作等)中拿到观察者句柄,然后传递状态参数给它。

使用:Oberserable的create中的事件实例中的call方法中可以拿到观察者对象,想传什么状态就传什么状态。 

猜你喜欢

转载自blog.csdn.net/qq_17441227/article/details/89365343