Длительный процесс в отдельном потоке обновления пользовательского интерфейса

Я заметил аналогичную проблему для точки NET, но моя проблема для Android, поэтому, возможно, решение выглядит иначе.

Процесс активируется нажатием кнопки. Процесс выполнялся как часть потока пользовательского интерфейса, и в конце он обновлял пользовательский интерфейс. Я добавил диалоговое окно прогресса, чтобы сделать его более удобным для пользователя, поэтому я создаю экземпляр потока, запускающего процесс, и в конце он обновляет пользовательский интерфейс и закрывает диалоговое окно прогресса. К сожалению, обновление пользовательского интерфейса не выполняется, за исключением следующего:

07-19 21:14:04.602: ERROR/Atjeews(283): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

Если я попытаюсь заблокировать поток пользовательского интерфейса и отпустить его после завершения длительного процесса обновления пользовательского интерфейса, диалоговое окно прогресса не будет отображаться. Должен ли я вместо этого попытаться показать диалог прогресса в отдельном потоке или есть другое более простое решение?


person Dmitriy R    schedule 20.07.2011    source источник


Ответы (2)


проверьте http://developer.android.com/resources/articles/painless-threading.html

person sunriser    schedule 20.07.2011
comment
@Dmitriy R я рекомендую вам использовать AsyncTask в Android для выполнения такой работы, как сказал стояк, чтобы проверить ссылку, следуя которой вы решите свою проблему. - person Herry; 20.07.2011

Взято со страницы Processes and Threads для разработчиков Android:

Чтобы решить эту проблему, Android предлагает несколько способов доступа к потоку пользовательского интерфейса из других потоков. Вот список методов, которые могут помочь:

Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)

Вы можете просто создать анонимный Runnable в качестве аргумента, например post(new Runnable(){doWhatever();}), который вместо этого будет делать все, что вы хотите, в потоке пользовательского интерфейса.

person AlbeyAmakiir    schedule 20.07.2011
comment
Извините, система не позволяет мне делать эти действия из-за моей плохой репутации. - person Dmitriy R; 22.07.2011
comment
Ну, похоже, что-то не так с системой. У вас больше, чем требуется 15 репутации, чтобы проголосовать. Кроме того, я считаю, что вы можете принять ответ даже с одним повторением. Вы должны поговорить с кем-нибудь об этом (может быть, в мете или что-то в этом роде), потому что это может снизить ваши шансы на получение полезных ответов. - person AlbeyAmakiir; 22.07.2011