синхронизация работы AlertDialog и множества AsynkTask в паралели
Итак, если кто-то с таким сталкивался то прошу поделится опытом. Имею 3 задачи для загрузки данных - создание ArrayMap и закидывания в них данных. Карт много, данных тоже, поэтому разбил на 3 потока. Мне нужно запустить что-то типа AlertDialog который у меня играет роль кастомного ProgressDialog который каким-то образом узнает что все задачи завершились и закроется
мой AlertDialog
public AlertDialog createIndeterminateProgressDialog(String message, int progressTintColor)
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
View view = View.inflate(context,R.layout.dialog_progress,null);
ProgressBar progressBar = view.findViewById(R.id.progressBar);
progressBar.setIndeterminateTintList(ColorStateList.valueOf(progressTintColor));
progressBar.setIndeterminate(true);
TextView tv = view.findViewById(R.id.tv_loading_msg);
tv.setText(message);
builder.setView(view);
return builder.create();
}
Задачи запускаю так
TaskLoadTranslationAndPaths taskLoadTranslationAndPaths = new TaskLoadTranslationAndPaths(this);
taskLoadTranslationAndPaths.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
TaskLoadCraftingBarter taskLoadCraftingBarter = new TaskLoadCraftingBarter(this);
taskLoadCraftingBarter.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
TaskLoadQuestsAndHideouItems taskLoadQuestsAndHideouItems = new TaskLoadQuestsAndHideouItems(this);
taskLoadQuestsAndHideouItems.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
Как запустить AlertDialog в одной задаче и закрыть его при ее завершении я знаю. Но как его запустить так чтобы он завершался только по завершению всех задач. Вариант запустить отдельную задачу из которой запускать другие явно не сработает (хотя не проверял), но даже если сработает выглядит как костыли.
Можно все и в один поток грузить, но тогда загрузка около 2 сек, в 3 потока 0,5с
Ответы (1 шт):
Решить получилось так:
В активности ввел переменную int executedTasks
int executedTasks = 0;
В каждом таске в onPostExecute увеличение этой переменной и проверка ее на равенство к-ву запущенных задач
protected void onPostExecute(Void aVoid) { ActivityMain activity = activityRef.get(); if (activity.isDestroyed()) return; activity.executedTasks++; if (activity.executedTasks == 3) { activity.dismissProgressDialog(); activity.progressDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); } activityRef.clear(); }
Если вы знаете другой способ, пожалуйста напишите