4

我有一些线程可以在其中创建一些视图并使它们准备显示。其中我也有一个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() 

这是一个有点奇怪,因为当我创建一个简单的按钮,一切都OK。所以,任何人都可以向我解释为什么创建一个WebView我得到这个异常,如果Looper.prepare()可以在这里帮助? 在此先感谢!

回答

7

一般来说,它不是安全的主线程之外创建视图。

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

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

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

+0

感谢您的快速回复 – fox

1

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

private Handler handler = new Handler(); 

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