WebView в потоке не может быть создан - PullRequest
5 голосов
/ 02 декабря 2011

У меня есть несколько потоков, в которых я создаю некоторые виды и готовлю их к отображению.Среди них у меня также есть 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() может помочь здесь?Заранее спасибо!

Ответы [ 2 ]

8 голосов
/ 02 декабря 2011

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

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

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

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

1 голос
/ 02 декабря 2011

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

private Handler handler = new Handler();

handler.post(new Runnable() {
   public void run() {
       lGraphWebView = new WebView(AppController.getAppController());
   }
});
...