rengwuxian / RxJavaSamples

RxJava 2 和 Retrofit 结合使用的几个最常见使用方式举例
3.94k stars 858 forks source link

BehaviourSubject示例的问题 #14

Open DevinFu opened 8 years ago

DevinFu commented 8 years ago

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

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对象.

dev4mobile commented 7 years ago

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