4

我有一些線程可以在其中創建一些視圖並使它們準備顯示。其中我也有一個WebView。此代碼是在線程中執行:無法創建線程中的WebView

WebView lGraphWebView = null; 
     try{ 
      lGraphWebView = new WebView(AppController.getAppController()); 
     }catch (Exception e) { 
      Log.d("info", "error: " +e); 
     } 

,並拋出以下異常:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

這是一個有點奇怪,因爲當我創建一個簡單的按鈕,一切都OK。所以,任何人都可以向我解釋爲什麼創建一個WebView我得到這個異常,如果Looper.prepare()可以在這裏幫助? 在此先感謝!

回答

7

一般來說,它不是安全的主線程之外創建視圖。

在您的特定情況下,這是不允許的,因爲WebView在其構造函數中創建Handler()以與UI線程進行通信。但由於Handler的默認構造函數將自己附加到當前線程,並且當前線程沒有運行Looper,所以您會看到此異常。

您可能會認爲創建一個循環線程(必須至少與WebView一樣長)才能幫助您,但這實際上是一個有風險的方法。我不會推薦它。

您應該堅持在主線程中創建WebView s。所有控件通常針對快速構建進行優化,因爲它們幾乎總是在UI線程中創建。

+0

感謝您的快速回復 – fox

1

您不應該在除主UI線程以外的線程中創建或操作視圖。例如,你可以使用Handler張貼到UI線程:

private Handler handler = new Handler(); 

handler.post(new Runnable() { 
    public void run() { 
     lGraphWebView = new WebView(AppController.getAppController()); 
    } 
});