z-chu / RxCache

简单一步,缓存搞定。这是一个专用于 RxJava,解决 Android 中对任何 Observable 发出的结果做缓存处理的框架

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

可以支持优先加载缓存,并且同时缓存最新的网络数据

conghuahuadan opened this issue · comments

你好,作者,可以支持优先加载缓存,并且同时缓存当前最新的网络数据吗

还没看RxCache,目前我的实现方式是用concat,但是concat会走再次onNext,所以把缓存数据和网络包装一下(定义一个类CachedFlag),做个标记,然后做filter。主要代码如下:


    public static <T> ObservableTransformer<List<T>, CachedFlag<T>> markCacheFlag(final boolean isFromCache) {
        return new ObservableTransformer<List<T>, CachedFlag<T>>() {
            @Override
            public ObservableSource<CachedFlag<T>> apply(Observable<List<T>> upstream) {
                return upstream.map(new Function<List<T>, CachedFlag<T>>() {
                    @Override
                    public CachedFlag<T> apply(List<T> data) {
                        CachedFlag<T> flag = new CachedFlag<>();
                        flag.setFromCache(isFromCache);
                        flag.setData(data);
                        return flag;
                    }
                });
            }
        };
    }

    public static <T> ObservableTransformer<CachedFlag<T>, List<T>> unMarkCacheFlag() {
        return new ObservableTransformer<CachedFlag<T>, List<T>>() {
            @Override
            public ObservableSource<List<T>> apply(Observable<CachedFlag<T>> upstream) {
                return upstream
                        .filter(new Predicate<CachedFlag<T>>() {
                            private boolean isSuccess;

                            @Override
                            public boolean test(CachedFlag<T> flagData) {
                                if (flagData.isFromCache() ) {
                                    if (flagData.getData() != null && flagData.getData().size() > 0) {
                                        isSuccess = true;
                                    }
                                } else {
                                    isSuccess = true;
                                }
                                return isSuccess;
                            }
                        })
                        .map(new Function<CachedFlag<T>, List<T>>() {
                            @Override
                            public List<T> apply(CachedFlag<T> flagData) {
                                return flagData.getData();
                            }
                        });
            }
        };
    }