ProgressBar и все приложение зависает

У меня есть приложение, и оно зависает, когда я показываю ProgressBar на экране. Когда я увеличиваю размер ProgressBar или когда я использую View вместо ProgressBar, он не зависает.

Когда он замораживает журналы LogCat:

D/OpenGLRenderer(13909): GL Error after OpenGLRenderer::setupDrawMesh-   glVertexAttribPointer OpenGLRenderer: 1285
D/OpenGLRenderer(13909): GL Error after OpenGLRenderer::setupDrawMesh-   glVertexAttribPointer OpenGLRenderer: 1285
D/OpenGLRenderer(13909): GL Error after OpenGLRenderer::drawTextureMesh()-   glDrawArrays OpenGLRenderer: 1285
D/OpenGLRenderer(13909): GL Error after OpenGLRenderer::setupDrawMesh- glDisableVertexAttribArray OpenGLRenderer: 1285

person user1977578    schedule 14.01.2013    source источник
comment
Вы бежите из потока пользовательского интерфейса. Вы должны использовать потоки. По телефону, иначе я был бы более полезным.   -  person Colton    schedule 14.01.2013
comment
Я пытался сделать это в другом потоке, но рисунки выполняются потоком пользовательского интерфейса, я не знаю, есть ли другой, чтобы сделать это.   -  person user1977578    schedule 14.01.2013
comment
@ user1977578 Спарксис прав. Чтобы рисовать в потоке пользовательского интерфейса, вы можете использовать метод Handlers, AsyncTasks или Activity.runOnUiThread().   -  person andr    schedule 14.01.2013
comment
Я уже устанавливаю параметры макета в методе Activity.runOnUiThread().   -  person user1977578    schedule 14.01.2013


Ответы (2)


Вы можете и должны использовать AsyncTask для вещей, которые вы хотите сделать вне потока пользовательского интерфейса. Вы увидите множество примеров, в которых ProgressDialog отображается и скрывается в различных методах жизненного цикла AsyncTask.

Вот один хороший пример (их много): Панель выполнения Android AsyncTask

person Booger    schedule 14.01.2013
comment
Я использую индикатор прогресса, а не диалог прогресса. Как я могу использовать это в моем случае? Как я могу сделать его нарисованным на другом потоке? - person user1977578; 14.01.2013

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

Или вы можете передать объект индикатора выполнения в поток движка, который может вызвать метод для обновления состояния вашего индикатора выполнения.

person Lajos Arpad    schedule 14.01.2013