Как превратить этот asyncTask в AsyncTaskLoader? - PullRequest
0 голосов
/ 01 марта 2019

Как превратить этот код 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);

        }
    }
}

1 Ответ

0 голосов
/ 02 марта 2019

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

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

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

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

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

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

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

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

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

Шаг 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

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

...