如何使用Rx2AndroidNetworking从json API缓存内容和数据?

问题描述 投票:0回答:1

我正在使用带有funcs的rxjava从我的API检索我的响应,如下所示:

@Override
public Single<MyInfoResponse> getMyInfoApiCall() {
    return Rx2AndroidNetworking.get(ApiEndPoint.ENDPOINT_MY_INFO)
            .addHeaders(mApiHeader.getProtectedApiHeader())
            .build()
            .getObjectSingle(MyInfoResponse.class);
}

现在,我正在检索此数据并在我的UI代码(使用常用的compositedisposables)中使用它,如下所示:

 @Override
    public void onViewPrepared() {
        getCompositeDisposable().add(getDataManager()
                .getMyInfoApiCall()
                .subscribeOn(getSchedulerProvider().io())
                .observeOn(getSchedulerProvider().ui())
                .subscribe(myInfoResponse -> {
                    getDataManager().updateMyManagerInfo(myInfoResponse);
                    if (myInfoResponse != null && myInfoResponse.getData() != null) {
                        getMvpView().updateMyRepo(myInfoResponse.getData());
                    }

                }, throwable -> {
                    if (!isViewAttached()) {
                        return;
                    }

                    getMvpView().hideLoading();

                    // handle the error here
                    if (throwable instanceof ANError) {
                        ANError anError = (ANError) throwable;
                        handleApiError(anError);
                    }
                }));
    }

现在,每次我都有互联网连接,并尝试检索数据,它工作正常,但一旦我失去互联网连接,我试图缓存此数据,所以它仍然显示在用户界面上,直到网络连接恢复,准备更新数据即时的。我如何以最简单,最理想的方式解决这个问题?

android rx-java2 android-networking android-json android-lru-cache
1个回答
0
投票

我建议你使用android Room Persistence来使用离线支持。从下面的链接看看谷歌样本 https://developer.android.com/topic/libraries/architecture/room

在这种情况下 预取请求(以便在需要时可以从缓存返回)

AndroidNetworking.get("https://fierce-cove-29863.herokuapp.com/getAllUsers/{pageNumber}")
                .addPathParameter("pageNumber", "0")
                .addQueryParameter("limit", "30")
                .setTag(this)
                .setPriority(Priority.LOW)
            .build()
            .prefetch();
  • 首先,服务器必须在标头中发送缓存控制,以便开始工作。
  • 响应将基于cache-control max-age,max-stale进行缓存。
  • 如果互联网连接且年龄未过期,则将从缓存返回。
  • 如果连接了互联网并且年龄已过期且服务器返回304(未修改),则它将从缓存返回。
  • 如果你使用getResponseOnlyIfCached(),如果没有连接互联网 - 它将从缓存返回,即使日期已过期。
  • 如果未连接互联网,如果您没有使用getResponseOnlyIfCached() - 它将不会返回任何内容。
  • 如果您使用的是getResponseOnlyFromNetwork(),它将仅在从服务器验证后返回响应。
  • 如果设置了缓存控制,它将根据服务器返回的max-age,max-stale工作。
  • 如果没有连接互联网只能获得缓存响应是通过使用getResponseOnlyIfCached()。 我刚刚完成了文档: Refer here
© www.soinside.com 2019 - 2024. All rights reserved.