AsyncTaskLoader не кэширует данные в автономном режиме - PullRequest
0 голосов
/ 20 июня 2020

Я создал AsyncTaskLoader для загрузки JSON данных из API. Однако я заметил, что если я поверну экран своего устройства, оно снова попытается загрузить данные из API.

В результате, если я отключу свое соединение Inte rnet и поверну экран, загрузчик не может вернуть данные из-за сбоя HTTP-запроса.

// NewsLoader.java
public class NewsLoader extends AsyncTaskLoader<String> {
    private String url;

    public NewsLoader(@NonNull Context context, String url) {
        super(context);
        this.url = url.trim();
    }

    @Override
    protected void onStartLoading() {
        forceLoad();
    }

    @Override
    public String loadInBackground() {
        if (url == null || url.isEmpty()) return null;
        return NetworkUtils.fetchNews(url);
    }
}

Затем,

// NewsActivity.java

// Initialising the loader
LoaderManager.getInstance(this).initLoader(LOADER_ID, args, this);

// onCreateLoader method
public Loader<String> onCreateLoader(int id, @Nullable Bundle args) {
    // Process args and get url
    return new NewsLoader(this, url);
}

Насколько мне известно, это ненормальное поведение для загрузчика. Есть идеи, что не так?

1 Ответ

0 голосов
/ 20 июня 2020

В конце концов я понял, в чем проблема. Данные необходимо кэшировать вручную, перехватив загруженные данные в пределах deliveryResult () и сохранив их в переменной экземпляра для дальнейшего использования.

Вот обновленный код.

// NewsLoader.java
public class NewsLoader extends AsyncTaskLoader<String> {
    private String url;
    private String cachedData = null;

    public NewsLoader(@NonNull Context context, String url) {
        super(context);
        this.url = url.trim();
    }

    @Override
    protected void onStartLoading() {
        if (cachedData != null) deliverResult(cachedData);
        else forceLoad();
    }

    @Override
    public String loadInBackground() {
        if (url == null || url.isEmpty()) return null;
        return NetworkUtils.fetchNews(url);
    }

    @Override
    public void deliverResult(String data) {
        cachedData = data;
        super.deliverResult(data);
    }
}
...