我正在爲Google Glass(SDK級別15)編寫一個應用程序,並且需要顯示WebView以在其中顯示一些html。爲了測試它,我定義了一個包含2個控件的佈局 - TextView和WebView。如果從SurfaceHandler渲染Android 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) at android.webkit.ZoomManager.onSizeChanged(ZoomManager.java:946) at android.webkit.WebView.onSizeChanged(WebView.java:5855) at android.view.View.setFrame(View.java:11362) at android.webkit.WebView.setFrame(WebView.java:5829) at android.view.View.layout(View.java:11273) at android .view.ViewGroup.layout(ViewGroup.java:4224) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1486) at android.widget .LinearLayout.onLayout(LinearLayout.java:1399) at android.view.View.layout(View.java:11279) at android.view.ViewGroup.layout(ViewGroup.java:4224) at android.widget.FrameLayout .onLayout(FrameLayout.java:431) at android.view.View.layout(View.java:11279) at android.view.ViewGroup.layout(ViewGroup.java:4224) 在android.widget.FrameLayout.onLayout(FrameLayout.java:431) 在android.view.View.layout(View.java:11279) 在機器人。 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不顯示?
感謝您的幫助!