【发布时间】: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();
}
}
) ;
}
所以我的问题是:
- 为什么在 Debug 模式下运行,在 Run 模式下运行失败?
- 如果我按上述方式更改代码,为什么 WebView 不显示任何内容?
感谢您的帮助!
【问题讨论】:
标签: android android-webview google-glass