Изменение видимости панели выполнения приводит к принудительному закрытию

#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);
   }
});