#android #progress-bar
#Android #индикатор выполнения
Вопрос:
У меня есть макет, содержащий WebView, и ProgressBar, расположенный по центру поверх него. Индикатор выполнения должен отображаться и скрываться программно (по мере загрузки веб-контента). Однако настройка ProgressBar на видимость с помощью loading.setVisibility(View.VISIBLE);
приводит к принудительному закрытию. Если панель выполнения видна по умолчанию, она работает нормально. При необходимости я вставлю весь соответствующий код, но подозреваю, что делаю что-то фундаментально и просто неправильное.
(должен иметь тег принудительного закрытия, но ни он, ни forceclose не существуют, и я не могу его создать.)
Хорошо, кодируй. Установленная видимость просто:
public void nowLoading() {
loading.setVisibility(View.VISIBLE);
}
Вызывается nowLoading… через javascript, с добавлением интерфейса JavascriptInterface в WebView. Ага… Я полагаю, что WevView находится в другом потоке. Как мне это решить?
Комментарии:
1. Пожалуйста, опубликуйте исключение, которое вы получаете, в LogCat.
2. Я думаю, это то, чего вы хотите: pastebin.com/2KYUdjYB
Ответ №1:
Вероятно, вы меняете видимость из неправильного потока. Выполняете ли вы изменение видимости в новом потоке, с которого вы начали Thread.start()
?
РЕДАКТИРОВАТЬ: используйте Handler
(см. http://developer.android.com/reference/android/os/Handler.html ). Отправьте сообщение обработчику, а затем выполните изменение видимости из обработчика. Или используйте View.post
(см. http://developer.android.com/reference/android/view/View.html#post(java.lang .Работоспособный)).
Комментарии:
1. Нет. Как мне убедиться, что я нахожусь в нужном потоке? Есть ли какой-либо способ, которым я ошибаюсь, если я не запускал его сам? Я очень новичок в Android.
2. Опубликовать некоторый код: самый простой способ решить эту проблему. Весь метод, который вы вызываете
setVisibility
, и любой другой метод, который вызывает этот (если это не метод жизненного цикла, такой какonCreate
).3. Я думаю, это то, что вы хотите:
4.
Thread [<8> WebViewCoreThread] (Suspended (exception ViewRoot$CalledFromWrongThreadException))
сказано совершенно ясно: вы где-то не в том потоке. Вам нужно будет взглянуть на свой код и выяснить, где вы вызываете что-то не из того потока: это будет трудно сделать, не взглянув на исходный код.5. Да, это вызывается из Javascript в WebView, который, как я полагаю, выполняется в другом потоке. Как мне запустить setVisibility в правильном?
Ответ №2:
попробуйте это :
YourActivity.runOnUIThread(new Runnable(){
@Override
public void run(){
loading.setVisibility(View.VISIBLE);
}
});