Поздно к вечеринке здесь, но ради полноты, есть еще один очень полезный трюк, о котором люди, возможно, захотят знать.
HKCU\Software\Microsoft\Office\xx.0\PowerPoint\Options
(, где xx.0 - 11.0 для Office 2003, 12.0 для Office 2007, 14.0 для Office 2010 ) DebugAddins
a DWORD=1
Появятся надстройки в IDE; вы можете их модифицировать, запускать, тестировать, в основном делать что-либо, кроме SAVE, поэтому после отладки вашего кода экспортируйте все модули / формы / классы, которые вы изменили, чтобы импортировать их в PPT / PPTM, который содержит ваш код и сохранить в качестве надстройки снова.
Это может сэкономить часы отладки tedium / time.
Общие шаги по использованию 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, чтобы запускать загрузчик всякий раз, когда вам это нужно в вашей деятельности:
Чтобы применить это в вашем примере:
Шаг 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
Надеюсь, что это удовлетворит ваши потребности, и вы можете проверить этот учебник для получения дополнительной информации