【问题标题】:A WebView in a thread can't be created无法创建线程中的 WebView
【发布时间】:2012-01-11 08:03:12
【问题描述】:

我有一些线程,我在其中创建了一些视图并准备将它们显示。其中我也有一个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() 可以在这里提供帮助? 提前致谢!

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2023-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多