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

Поздно к вечеринке здесь, но ради полноты, есть еще один очень полезный трюк, о котором люди, возможно, захотят знать.

  1. Закройте PPT, если он запущен
  2. В REGEDIT перейдите к HKCU\Software\Microsoft\Office\xx.0\PowerPoint\Options (, где xx.0 - 11.0 для Office 2003, 12.0 для Office 2007, 14.0 для Office 2010 )
  3. Добавить DebugAddins a DWORD=1
  4. Завершить regedit.

Появятся надстройки в IDE; вы можете их модифицировать, запускать, тестировать, в основном делать что-либо, кроме SAVE, поэтому после отладки вашего кода экспортируйте все модули / формы / классы, которые вы изменили, чтобы импортировать их в PPT / PPTM, который содержит ваш код и сохранить в качестве надстройки снова.

Это может сэкономить часы отладки tedium / time.

1
задан Alain Merigot 1 March 2019 в 00:20
поделиться

1 ответ

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

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

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

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

  • onCreateLoader() >> выполняется в основном потоке для создания экземпляра загрузчика
  • onLoadFinished() >> выполняется в основном потоке для отправки фоновые результаты & amp; обновить пользовательский интерфейс .. аналогично 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();
        }
    }
}

[1143 ] Шаг 2 & amp; 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 & amp; ViewModels

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

0
ответ дан Zain 1 March 2019 в 00:20
поделиться
Другие вопросы по тегам:

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