Что имеет приоритет: Завершающий тег или Измененный в последний раз HTTP-заголовок?

Общие шаги по использованию AsyncTaskLoader:

o Шаг 1: Создать пользовательский класс Loader, который расширяет AsyncTaskLoader; D: список объектов, возвращаемых из фоновой задачи, которая реализована с использованием метода loadInBackground(); и затем переопределите следующие методы:

  • loadInBackground() >> работает в фоновом режиме для загрузки тяжелой работы .. аналогично doInBackground() из AsyncTask
  • onStartLoading() >> запускается после создания загрузчика и непосредственно перед loadInBackground(); может использоваться для возврата предыдущих загруженных результатов с помощью deliverResult() или для загрузки новых результатов с помощью повторного запуска фоновой задачи с помощью forceLoad()

o Шаг 2: Реализация LoaderCallbacks в вашей деятельности, которая требует фонового процесса. Для этого необходимо реализовать 3 метода:

  • onCreateLoader() >> выполняется в основном потоке для создания экземпляра загрузчика
  • onLoadFinished() >> выполняется в основном потоке для отправки фоновые результаты & amp; обновить пользовательский интерфейс .. аналогично onPostExecute() из AsyncTask

  • onLoaderReset() >> сбросить данные загрузчика

o Шаг 3: используйте LoaderManager, чтобы запускать загрузчик всякий раз, когда вам это нужно в вашей деятельности:

  • Примечание: (обязательно импортируйте правильный Loader & LoaderManager, если вы используете поддержку V4 библиотека)

Чтобы применить это в вашем примере:

Шаг 1:

public class MovieLoader extends AsyncTaskLoader> { // STEP 1

    private List movies;
    private int mMovieType;

    MovieLoader(@NonNull Context context, Integer movieType) {
        super(context);
        mMovieType = movieType;
    }

    @Override
    public List loadInBackground() {

        switch (mMovieType) {
            case TOP_RATED:
                movies = new movieListFetcher().getTopRatedList();
                break;
            case MOST_POPULAR:
                movies = new movieListFetcher().getMostPopularList();
        }

        return movies;
    }

    @Override
    protected void onStartLoading() {
        super.onStartLoading();
        if (movies != null) {
            // To skip loadInBackground() call
            deliverResult(movies);
        } else {
            // to run loadInBackground()
            forceLoad();
        }
    }
}

[1143 ] Шаг 2 & amp; 3:

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks> { // STEP 2

    final int LOADER_ID = 1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // initialize RecyclerView Adapter
        // Set RecyclerView mAdapter
        mAdapter = new CustomAdapter(...);
        RecyclerView recyclerView = findViewById(...);
        recyclerView.setAdapter(mAdapter);

        // Loading data in background by instantiating a new loader
        getSupportLoaderManager().initLoader(LOADER_ID, null, this); // STEP 3
    }

    @NonNull
    @Override
    public Loader> onCreateLoader(int id, Bundle args) {
        return new MovieLoader(MainActivity.this, TOP_RATED);
    }

    @Override
    public void onLoadFinished(@NonNull Loader> loader, List movies) {

        // Update UI
        if (movies != null) {
            mAdapter.notifyDataSetChanged();
        }
    }

    @Override
    public void onLoaderReset(@NonNull Loader> loader) {
        mAdapter.setMovies(new ArrayList()); // create this custom method in your recyclerView adapter
    }

}

Обратите внимание, что загрузчики теперь устарели и заменены на LiveData & amp; ViewModels

Надеюсь, что это удовлетворит ваши потребности, и вы можете проверить этот учебник для получения дополнительной информации

80
задан user101442 5 May 2009 в 09:55
поделиться

2 ответа

Разве это не похоже на выражение «ИЛИ». В псевдокоде:

if ETagFromServer != ETagOnClient || LastModifiedFromServer != LastModifiedOnClient
   GetFromServer
else
   GetFromCache
20
ответ дан 24 November 2019 в 09:59
поделиться

Согласно RFC 2616 раздел 13.3.4, клиент HTTP 1.1 ДОЛЖЕН использовать ETag в любых условных запросах кеширования, и если присутствуют как ETag, так и Last Modified , он ДОЛЖЕН использовать оба. Заголовок ETag считается сильным валидатором (см. Раздел 13.3.3), если сервер явно не объявил его слабым, тогда как заголовок Last Modified считается слабым, если между ним и заголовком Date не существует хотя бы минутной разницы. Обратите внимание, однако, что сервер также не обязан отправлять (но он ДОЛЖЕН, если он может).

Обратите внимание, что клиент не проверяет заголовки, чтобы увидеть, изменились ли они; он просто слепо использует их в следующем условном запросе; Сервер должен оценить, отправлять ли запрошенное содержимое или ответ 304 Not Modified. Если Сервер отправляет только один, тогда Клиент будет использовать только его (хотя для запроса диапазона полезны только сильные валидаторы). Конечно, это также на усмотрение промежуточных кешей (если они не были заблокированы от кеширования с помощью директив Cache Control) и Сервера в отношении того, как они будут действовать с заголовками; RFC гласит, что они НЕ ДОЛЖНЫ возвращать 304 Not Modified, если валидаторы несовместимы, но поскольку значения заголовков генерируются сервером, у него довольно много свободы действий.

На практике я заметил, что Chrome, FireFox , и IE 7+ отправляют оба заголовка, если они доступны. Я также протестировал поведение при отправке измененных заголовков, о чем я уже подозревал, исходя из информации в RFC. Четыре клиента, которые я тестировал, отправляли условные запросы только в том случае, если страница (страницы) обновлялась или если это был первый раз, когда страница была запрошена текущим процессом.

88
ответ дан 24 November 2019 в 09:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: