Общие шаги по использованию 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, чтобы запускать загрузчик всякий раз, когда вам это нужно в вашей деятельности:
Чтобы применить это в вашем примере:
Шаг 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
Надеюсь, что это удовлетворит ваши потребности, и вы можете проверить этот учебник для получения дополнительной информации
Разве это не похоже на выражение «ИЛИ». В псевдокоде:
if ETagFromServer != ETagOnClient || LastModifiedFromServer != LastModifiedOnClient
GetFromServer
else
GetFromCache
Согласно 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. Четыре клиента, которые я тестировал, отправляли условные запросы только в том случае, если страница (страницы) обновлялась или если это был первый раз, когда страница была запрошена текущим процессом.