RxJavaSamples icon indicating copy to clipboard operation
RxJavaSamples copied to clipboard

BehaviourSubject示例的问题

Open DevinFu opened this issue 9 years ago • 1 comments

代码中在演示BehaviourSubject如何使用时, 存在两个问题.

    1. Data类中loadFromNetwork()函数如果因为网络未连接而发生错误, 不会通知界面CacheFragment进行数据更新.
    1. 我尝试通过如下代码修复问题一:
public void loadFromNetwork() {
        Network.getGankApi()
                .getBeauties(100, 1)
                .subscribeOn(Schedulers.io())
                .map(GankBeautyResultToItemsMapper.getInstance())
                .doOnNext(new Action1<List<Item>>() {
                    @Override
                    public void call(List<Item> items) {
                        Database.getInstance().writeItems(items);
                    }
                })
                .subscribe(new Action1<List<Item>>() {
                    @Override
                    public void call(List<Item> items) {
                        cache.onNext(items);
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        throwable.printStackTrace();
                        //新增代码: 手动触发cache的错误回调函数
                    cache.onError(throwable);
                    }
                });
    }

修复完成之后发现, 若第一次请求因为网络不可用问题发生错误, 则在网络恢复之后重试请求时, 会直接触发onError函数, 原因是由于cache作为BehaviorSubject, 其中最后一个元素是Throwable. 一旦产生新的订阅, 则立即发送Throwable对象.

DevinFu avatar Sep 19 '16 10:09 DevinFu

@DevinFu BehaviorSubject 改为 PublicSubject 就不会发生恢复网络请求立即发送Throwable 对象了

dev4mobile avatar Oct 21 '16 07:10 dev4mobile