【问题标题】:Android WebView is empty if rendered from SurfaceHandler如果从 SurfaceHandler 呈现,Android WebView 为空
【发布时间】:2014-01-19 09:29:37
【问题描述】:

我正在为 Google Glass(SDK 级别 15)编写一个应用程序,需要显示 WebView 以在其中显示一些 html。为了测试它,我定义了一个带有 2 个控件的布局 - TextView 和 WebView。

我在 SurfaceHolder.Callback 中进行的所有渲染。重要的是回调方法在后台线程上执行。

在调试模式下一切正常 - TextView 和 WebView 显示内容正常。但是一旦我切换到运行配置应用程序崩溃异常:

java.lang.RuntimeException:无法在线程内创建处理程序 没有调用 Looper.prepare() 在 android.os.Handler.(Handler.java:121) 在 android.webkit.ZoomControlExternal.(ZoomControlExternal.java:36) 在 android.webkit.ZoomManager.getCurrentZoomControl(ZoomManager.java:1188) 在 android.webkit.ZoomManager.dismissZoomPicker(ZoomManager.java:1204) 在 android.webkit.ZoomManager.onSizeChanged(ZoomManager.java:946) 在 android.webkit.WebView.onSizeChanged(WebView.java:5855) 在 android.view.View.setFrame(View.java:11362) 在 android.webkit.WebView.setFrame(WebView.java:5829) 在 android.view.View.layout(View.java:11273) 在 android.view.ViewGroup.layout(ViewGroup.java:4224) 在 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628) 在 android.widget.LinearLayout.layoutVertical(LinearLayout.java:1486) 在 android.widget.LinearLayout.onLayout(LinearLayout.java:1399) 在 android.view.View.layout(View.java:11279) 在 android.view.ViewGroup.layout(ViewGroup.java:4224) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:431) 在 android.view.View.layout(View.java:11279) 在 android.view.ViewGroup.layout(ViewGroup.java:4224) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:431) 在 android.view.View.layout(View.java:11279) 在 android.view.ViewGroup.layout(ViewGroup.java:4224) 在 com.adnecs.fit.TestDrawer.surfaceChanged(TestDrawer.java:61) 在 com.google.android.glass.timeline.RemoteSurfaceHolder.setParameters(RemoteSurfaceHolder.java:104) 在 com.google.android.glass.timeline.LiveCard$1.performDirectRenderingOperation(LiveCard.java:190) 在 com.google.android.glass.timeline.ITimelinePublisher$Stub.onTransact(ITimelinePublisher.java:60) 在 android.os.Binder.execTransact(Binder.java:338) 在 dalvik.system.NativeStart.run(Native Method)

原因很清楚 - 需要在 UI 线程上调用布局方法。我从 UI 线程传递了一个 Handler 对象并尝试在其上运行“布局”方法。 对 TextView 效果很好,但 WebView 总是空白。

以下是更改后的代码(我留下了旧版本的注释):

@Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) {

        final int measuredWidth = View.MeasureSpec.makeMeasureSpec(i2, View.MeasureSpec.EXACTLY);
        final int measuredHeight = View.MeasureSpec.makeMeasureSpec(i3, View.MeasureSpec.EXACTLY);
//      mView.measure(measuredWidth, measuredHeight);
//      mView.layout(0, 0, mView.getMeasuredWidth(), mView.getMeasuredHeight());
//      draw();

        mView.getHandler().post(
                new Runnable() {
                    @Override
                    public void run() {
                        mView.measure(measuredWidth, measuredHeight);
                        mView.layout(0, 0, mView.getMeasuredWidth(), mView.getMeasuredHeight());
                        draw();
                    }
                }
        )    ;
    }

所以我的问题是:

  1. 为什么在 Debug 模式下运行,在 Run 模式下运行失败?
  2. 如果我按上述方式更改代码,为什么 WebView 不显示任何内容?

感谢您的帮助!

【问题讨论】:

    标签: android android-webview google-glass


    【解决方案1】:

    能够解决这个问题(如果更多知识渊博的人可以评论或纠正我也很好)

    首先,您必须在 UI 线程上运行 WebView 更新。

    1. 为什么它在 Debug 中起作用:看起来这完全与时间有关。当您在 WebView 上运行 loadData 时,需要一些时间来处理它。如果您在设置数据后立即调用draw - 控件仍将为空 - 内容页面尚未准备好。

    2. 我所做的是运行渲染线程直到页面被加载。为了确定页面是否已加载,我使用webview.setWebViewClient 注册回调并对onPageFinished 做出反应。

    【讨论】:

      猜你喜欢
      • 2012-02-04
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      • 2016-08-19
      相关资源
      最近更新 更多