Как я могу кэшировать контент и данные из json API с помощью Rx2AndroidNetworking? - PullRequest
0 голосов
/ 16 апреля 2019

Я получаю свой ответ из моего API с помощью rxjava со следующими функциями:

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

Теперь я извлекаю эти данные и использую их в своем коде пользовательского интерфейса (с обычными составными элементами) следующим образом:

 @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);
                    }
                }));
    }

Теперь каждый раз, когда у меня есть подключение к Интернету, и он пытается получить данные, он работает нормально, но как только я теряю подключение к Интернету, я пытаюсь кэшировать эти данные, чтобы они по-прежнему отображались в пользовательском интерфейсе до тех пор, пока подключение к сети не будет восстановлено и готово. обновлять данные в режиме реального времени. Как мне сделать это самым простым и идеальным способом?

1 Ответ

0 голосов
/ 16 апреля 2019

Я предлагаю вам использовать автономную поддержку с помощью Android Room Persistence.Взгляните на пример Google по приведенной ниже ссылке
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();
  • Прежде всего сервер должен отправить контроль заголовка в заголовке, чтобы он начал работать.

  • Ответ будет кэшированна основе контроля кеша max-age, max-stale.

  • Если Интернет подключен, а срок действия НЕ истек, он вернется из кэша.

  • Если Интернет подключен, а срок действия истек, и если сервер возвращает 304 (НЕ ИЗМЕНЕНО), он вернется из кэша.

  • Если Интернет НЕ подключен, если вы используетеgetResponseOnlyIfCached () - он вернется из кеша, даже если дата истекла.

  • Если к интернету НЕ подключено, если вы НЕ используете getResponseOnlyIfCached () - он НЕ вернет ничего.

  • Если вы используете getResponseOnlyFromNetwork (), онбудет возвращать ответ только после проверки с сервера.

  • Если установлен контроль кэша, он будет работать в соответствии с max-age, max-stale, возвращаемым с сервера.

  • Если Интернет НЕ подключен, единственный способ получить кеш Ответ - использовать getResponseOnlyIfCached ().

    Я только что просмотрел документы:
    См. Здесь

...