Как превратить этот asyncTask в AsyncTaskLoader?

Как превратить этот код 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? или нужно знать, как обращаться с перечислением в этом случае?

Zain 01.03.2019 00:22

Мне нужно знать, как вообще превратить AsyncTask в AsyncTaskLoader.

دعاء مصطفى 02.03.2019 10:12

@ دعاء مصطفى, пожалуйста, проверьте мой ответ, надеюсь, он будет вам полезен

Zain 02.03.2019 13:53

@M.Zain Большое спасибо, это было очень полезно

دعاء مصطفى 04.03.2019 10:46

Не за что .. рад, что это помогает

Zain 04.03.2019 11:52
1
5
914
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

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

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

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

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

Как это может быть объявлено устаревшим с помощью ViewModel и LiveData?

vijaypalod 15.08.2020 07:36

Другие вопросы по теме