首页 文章

如果从SurfaceHandler渲染,Android WebView为空

提问于
浏览
0

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

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

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

java.lang.RuntimeException:无法在Android.os.Handler中调用Looper.prepare()的线程内部创建处理程序 . (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位于android.view.View.setout的Android.view.WebView.setFrame(WebView.java:5829)的android.view.View.setFrame(View.java:11362)的.WebView.onSizeChanged(WebView.java:5855)在Android.widget.LinearLayout.layoutVertical的android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628)上的android.view.ViewGroup.layout(ViewGroup.java:4224)中的View.java:11273)(LinearLayout.java:1486 )在android.widget.Linout.onLayout(LinearLayout.java:1399)的android.view.Viewout上的android.view.View.layout(View.java:11279)android.view.layout(ViewGroup.java:4224) t.FrameLayout.onLayout(FrameLayout.java:431)位于android.view.FoutLayout.onLayout的android.view.View.layout(View.java:11279)android.view.ViewGroup.layout(ViewGroup.java:4224) (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)at com.google.android.glass.timeline.LiveCard $ 1.performDirectRenderingOperation(LiveCard.java:190)at com . google.android.glass.timeline.ITimelinePublisher $ Stub.onTransact(ITimelinePublisher.java:60)at android.os.Binder.execTransact(Binder.java:338)at dalvik.system.NativeStart.run(Native Method)

原因很清楚 - 需要在UI线程上调用布局方法 . 我从UI线程传递了一个Handler对象,并尝试在其上运行'layout'方法 . 适用于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();
                    }
                }
        )    ;
    }

所以我的问题是:

  • 为什么它在调试模式下工作并且无法在运行模式下运行?

  • 如果我更改上面的代码,为什么WebView没有显示任何内容?

感谢您的帮助!

1 回答

  • 0

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

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

    • 为什么它在Debug中工作:看起来就像时间一样 . 在WebView上运行 loadData 时,需要一些时间来处理它 . 如果在设置数据后立即调用 draw - 控件仍为空 - 内容页面尚未就绪 .

    • 我做的是在页面加载之前运行渲染线程 . 要确定页面是否已加载,我使用 webview.setWebViewClient 注册回调并对 onPageFinished 作出反应 .

相关问题