WebView в потоке не может быть создан

у меня есть несколько потоков, в которых я создаю некоторые представления и подготавливаю их к отображению. Среди них у меня также есть WebView. Этот код выполняется в потоке:

WebView lGraphWebView = null;
        try{
            lGraphWebView = new WebView(AppController.getAppController());
        }catch (Exception e) {
            Log.d("info", "error: " +e );
        }

и выдает следующее исключение:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

Это немного странно, потому что когда я создаю простую кнопку, все в порядке. Итак, может ли кто-нибудь объяснить мне, почему при создании WebView я получаю это исключение, и может ли Looper.prepare() помочь здесь? Заранее спасибо!


person fox    schedule 02.12.2011    source источник


Ответы (2)


В общем, небезопасно создавать представление вне основного потока.

В вашем конкретном случае это не разрешено, потому что WebView создает Handler() в своем конструкторе для связи с потоком пользовательского интерфейса. Но поскольку конструктор Handler по умолчанию присоединяется к текущему потоку, а в текущем потоке не запущен Looper, вы получаете это исключение.

Вы можете подумать, что создание потока петлителя (который должен быть активен как минимум до WebView) может помочь вам, но на самом деле это рискованный путь. И я бы не рекомендовал его.

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

person inazaruk    schedule 02.12.2011

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

private Handler handler = new Handler();

handler.post(new Runnable() {
   public void run() {
       lGraphWebView = new WebView(AppController.getAppController());
   }
});
person alex.zherdev    schedule 02.12.2011