РЕДАКТИРОВАТЬ : Этот вопрос не является дубликатом, как
- Всего пару дней назад AOSP коммит на амортизацию был сделан.
- Другой вопрос касается использования AsyncTaskLoader поверх AsyncTask.
Google не поддерживает Android AsyncTask API в Android 11 и предлагает использовать java.util.concurrent
вместо этого. Вы можете проверить коммит здесь
*
* @deprecated Use the standard <code>java.util.concurrent</code> or
* <a href="https://developer.android.com/topic/libraries/architecture/coroutines">
* Kotlin concurrency utilities</a> instead.
*/
@Deprecated
public abstract class AsyncTask<Params, Progress, Result> {
Если вы поддерживаете более старую кодовую базу с асинхронными задачами в Android, вам, вероятно, придется изменить ее в будущем. Мой вопрос заключается в том, что должна быть правильная замена фрагмента кода, показанного ниже, используя java.util.concurrent
. Это статический внутренний класс Деятельности. Я ищу то, что будет работать сminSdkVersion 16
private static class LongRunningTask extends AsyncTask<String, Void, MyPojo> {
private static final String TAG = MyActivity.LongRunningTask.class.getSimpleName();
private WeakReference<MyActivity> activityReference;
LongRunningTask(MyActivity context) {
activityReference = new WeakReference<>(context);
}
@Override
protected MyPojo doInBackground(String... params) {
// Some long running task
}
@Override
protected void onPostExecute(MyPojo data) {
MyActivity activity = activityReference.get();
activity.progressBar.setVisibility(View.GONE);
populateData(activity, data) ;
}
}
AsyncTask
не может быть удален без нарушения обратной совместимости.Ответы:
Хорошо, что это устарело, потому что это
WeakReference<Context>
был взлом, а не правильное решение .Теперь у людей будет возможность дезинфицировать свой код.
Основанный на этом коде,
Progress
фактически не нужен, и естьString
вход +MyPojo
выход.На самом деле это довольно легко сделать без использования AsyncTask.
Как пройти в Струне? Вот так:
А также
В этом примере используется однопоточный пул, который подходит для записи в БД (или сериализованных сетевых запросов), но если вы хотите что-то для чтения БД или нескольких запросов, вы можете рассмотреть следующую конфигурацию Executor:
источник
executor.post
. Неexecute()
вместоpost()
Context
это? Я знаю, что передачаContext
вAsyncTask
была одной из проблем.newSingleThreadExecutor
лучше для записи, но вы обязательно должны использоватьTHREAD_POOL_EXECUTOR
в конце поста для чтения базы данных.Google рекомендует использовать среду параллелизма Java или Kotlin Coroutines. но у Rxjava гораздо больше гибкости и возможностей, чем у Java-параллелизма, поэтому он приобрел немалую популярность.
источник