Забавно, как вы можете публиковать 3 раза один и тот же ответ, потому что люди не ищут, прежде чем они отправят ...
Вам НЕ разрешен доступ к потоку пользовательского интерфейса из любого места, кроме потока пользовательского интерфейса ... Это означает, что ваши Dialog.dismiss и Dialog.cancel не могут быть выполнены, поскольку он не является безопасным для потока ...
Чтобы решить вашу проблему, у вас есть несколько способов. Первый способ: НЕ используйте AsyncTask
, так как у вас будет запущено 5 задач (не более) каждый раз ... Я отправляю вас в Android Doc AsyncTask
, и инструкции для процессов и потоков прилагаются для получения дополнительной информации.
Второй способ: Переместить все методы, связанные с вашим пользовательским интерфейсом, в onPostExecute()
. Это поточно-ориентированный, и результат doInBackground()
автоматически передается на него.
Третий способ: использовать следующее
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
Runnable будет выполняться внутри потока пользовательского интерфейса. Итак, еще раз. Потокобезопасна.
Я рекомендую второе решение, если вам действительно не нужно, чтобы ваше приложение было тщательно оптимизировано. Если это так, используйте задачи, добавленные вручную к созданному вручную ThreadPoolExecutor
(снова см. Документ ThreadPoolExecutor
).
При поиске в документе я нашел это:
Для правильной работы этого класса необходимо соблюдать несколько правил потоков:
The task instance must be created on the UI thread.
execute(Params...) must be invoked on the UI thread.
Do not call onPreExecute(), onPostExecute(Result),
doInBackground(Params...), onProgressUpdate(Progress...)
manually.
The task can be executed only once (an exception will be thrown
if a second execution is attempted.)
Если не в потоке пользовательского интерфейса, не используйте AsyncTask
, а вместо этого Задачу с ThreadPoolExecutor
, чтобы обернуть их.
Вот почему НЕ следует использовать Asynctask
: Как я могу устанавливать асинхронные URL-соединения на Android?
поищите мое имя в ответах.