Как превратить этот код AsyncTask в AsyncTaskLoader, поскольку movieListFetcher.listType является перечислением?
class LoadMovieList extends AsyncTask<movieListFetcher.listType, Void, Void> {
@Override
protected Void doInBackground(movieListFetcher.listType... params) {
movies = null;
switch (params[0]) {
case TOP_RATED:
movies = new movieListFetcher().getTopRatedList();
break;
case MOST_POPULAR:
movies = new movieListFetcher().getMostPopularList();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
if (movies != null) {
adapter.notifyDataSetChanged();
recyclerView.setAdapter(adapter);
}
}
}
Мне нужно знать, как вообще превратить AsyncTask в AsyncTaskLoader.
@ دعاء مصطفى, пожалуйста, проверьте мой ответ, надеюсь, он будет вам полезен
@M.Zain Большое спасибо, это было очень полезно
Не за что .. рад, что это помогает
Общие шаги по использованию AsyncTaskLoader:
о Шаг 1: Создайте собственный класс загрузчика, который расширяет AsyncTaskLoader<D>;
D: список объектов, которые возвращаются из фоновой задачи, реализованной методом loadInBackground(); а затем переопределить следующие методы:
loadInBackground() >> работает в фоновом режиме, чтобы загрузить тяжелую работу .. похоже на doInBackground() из AsyncTaskonStartLoading() >> запускается после создания загрузчика и непосредственно перед loadInBackground(); может использоваться для возврата ранее загруженных результатов с помощью deliverResult() или для загрузки новых результатов путем повторного запуска фоновой задачи с помощью forceLoad()о Шаг 2: Реализуйте LoaderCallbacks<D> в своей деятельности, для которой требуется фоновый процесс. Для этого требуется реализовать 3 метода:
onCreateLoader() >> выполняется в основном потоке для создания экземпляра загрузчикаonLoadFinished() >> выполняется в основном потоке для отправки фоновых результатов и обновления пользовательского интерфейса .. аналогично onPostExecute() из AsyncTask
onLoaderReset() >> сбросить данные загрузчика
о Шаг 3: используйте LoaderManager для запуска вашего загрузчика всякий раз, когда вам это нужно в вашей деятельности:
Чтобы применить это в вашем примере:
Шаг 1:
public class MovieLoader extends AsyncTaskLoader<List<Movie>> { // STEP 1
private List<Movie> movies;
private int mMovieType;
MovieLoader(@NonNull Context context, Integer movieType) {
super(context);
mMovieType = movieType;
}
@Override
public List<Movie> 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();
}
}
}
Шаг 2 и 3:
public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<List<Movie>> { // 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<List<Movie>> onCreateLoader(int id, Bundle args) {
return new MovieLoader(MainActivity.this, TOP_RATED);
}
@Override
public void onLoadFinished(@NonNull Loader<List<Movie>> loader, List<Movie> movies) {
// Update UI
if (movies != null) {
mAdapter.notifyDataSetChanged();
}
}
@Override
public void onLoaderReset(@NonNull Loader<List<Movie>> loader) {
mAdapter.setMovies(new ArrayList<Movie>()); // create this custom method in your recyclerView adapter
}
}
Обратите внимание, что загрузчики теперь устарели и заменены на LiveData и ViewModels.
Надеюсь, это удовлетворит ваши потребности, и вы можете проверить этот руководство для получения дополнительной информации.
Как это может быть объявлено устаревшим с помощью ViewModel и LiveData?
Вам нужно знать, как вообще превратить AsyncTask в AsyncTaskLoader? или нужно знать, как обращаться с перечислением в этом случае?