无法创建线程中的WebView

时间:2011-12-02 08:53:36

标签: android multithreading android-widget android-webview looper

我有一些线程,我在其中创建一些视图并准备显示它们。其中我也有一个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 个答案:

答案 0 :(得分:8)

通常,在主线程之外创建视图是不安全的。

在您的特定情况下,这是不允许的,因为WebView在其构造函数中创建Handler()以与UI线程进行通信。但由于Handler的默认构造函数将自身附加到当前线程,并且当前线程没有运行Looper,因此您将获得此异常。

您可能认为创建一个looper线程(必须至少与WebView一样长)可能对您有所帮助,但这实际上是一种冒险的方法。我不推荐它。

你应该坚持在主线程中创建WebView。所有控件通常都针对快速构造进行了优化,因为它们几乎总是在UI线程中创建。

答案 1 :(得分:1)

您不应在主UI线程以外的线程中创建或操作视图。例如,您可以使用Handler发布到UI线程:

private Handler handler = new Handler();

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