2014-01-17 81 views
0

我正在爲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(); 
        } 
       } 
     ) ; 
    } 

所以我的問題是:

  1. 爲什麼它在調試模式下工作,並未能在運行模式下運行?
  2. 如果我更改了上面的代碼,爲什麼WebView不顯示?

感謝您的幫助!

回答

0

之所以能夠算出這個(也將是不錯如果有更多的見地人們可以發表評論或指正)

首先,你必須運行在UI線程的WebView更新。

  1. 它爲什麼在Debug中起作用:看起來像是關於時機。當您在WebView上運行loadData時,需要一些時間來處理它。如果在設置數據後立即致電draw - 控件仍將爲空 - 內容頁尚未準備好。

  2. 我所做的是在加載頁面之前運行渲染線程。要確定頁面是否已加載,我使用webview.setWebViewClient來註冊回調並對onPageFinished作出反應。