2011-04-20 136 views
3

不幸的是,我不能可靠地重現此錯誤,但很少有我得到它,偶爾也會在實時崩潰日誌中報告。這裏有一個堆棧跟蹤報道由用戶與Droid 2.2.2 FRG83GAndroid錯誤:WebViewCore失敗,並聲明錯誤

junit.framework.AssertionFailedError 
at junit.framework.Assert.fail(Assert.java:47) 
at junit.framework.Assert.assertTrue(Assert.java:20) 
at junit.framework.Assert.assertNull(Assert.java:233) 
at junit.framework.Assert.assertNull(Assert.java:226) 
at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:594) 
at java.lang.Thread.run(Thread.java:1096) 

這似乎是因爲這一行WebViewCore.java

Assert.assertNull(sWebCoreHandler); 

不知sWebCoreHandler這是android.os.Handler私有靜態實例 (感謝@Idolon爲更正)已經初始化,但我不知道如何解決或防止此問題。

這經常發生,足以讓我擔心。當應用程序正在加載Activity時,似乎也發生了一些有趣的事情,即使其中一項活動確實沒有WebView,它也沒有。

P.S.這是因爲提交的bug#16258

+0

是嗎?你想要什麼?你能告訴我們你的webview中是否有「特殊」的東西? – 2011-10-04 07:51:49

+0

我想要有人解釋我有什麼問題以及如何避免/解決問題。 「我的」webview中沒有什麼特別的,當我運行代碼時,我無法再現這個錯誤,但是我的ACRA日誌充滿了它。這是完整的堆棧跟蹤 – Bostone 2011-10-05 15:27:02

+0

您是否有任何線索在您的代碼中導致該問題?如果您是唯一一個在6個月內報告過此錯誤的人,那麼可能是您的代碼中存在一個錯誤。 – slayton 2011-10-05 18:37:04

回答

3

望着罪證源代碼

public WebViewCore(Context context, WebView w, CallbackProxy proxy, 
     Map<String, Object> javascriptInterfaces) { 

    //.... 

    // We need to wait for the initial thread creation before sending 
    // a message to the WebCore thread. 
    // XXX: This is the only time the UI thread will wait for the WebCore 
    // thread! 
    synchronized (WebViewCore.class) { 
     if (sWebCoreHandler == null) { 
      // Create a global thread and start it. 
      Thread t = new Thread(new WebCoreThread()); 

      //... 

     } 
    } 

//... 

private static Handler sWebCoreHandler; 
// Class for providing Handler creation inside the WebCore thread. 
private static class WebCoreThread implements Runnable { 
    public void run() { 
     Looper.prepare(); 
     Assert.assertNull(sWebCoreHandler); // this assertion fails 
     synchronized (WebViewCore.class) { 
      sWebCoreHandler = new Handler() { 
     //... 

這在任何WebView的構造函數被執行,斷言錯誤來自WebCoreThread構造函數,它只是叫當sWebCoreHandler爲空時,所以這個斷言在理論上應該永遠不會失敗。除了它在synchronized子句之外運行,並且在一個在synchronized子句中創建並啓動的新線程內,據說只有一次。

看來你的錯誤與併發創建webviews有關。如果您的應用程序只有一個活動和一個webview,請確保此活動的調用次數不是必要的(一次一個),WebView是在onCreate方法而不是活動構造函數中創建的,而startActivity是在主線程中調用,你應該很好。

+0

這些都是很好的,有效的點,但是因爲它 - 我的代碼中只有一個WebView在onCreate活動方法中初始化。我不知道這是否與停止/重新啓動或暫停/激活活動,並以某種方式丟失過程中的靜態單例? – Bostone 2011-10-08 05:01:49

+1

OMG ...這種天真的同步。如果有人試圖從不同線程創建2個'WebView',它可能導致一個斷言錯誤。他們應該真正使用[「初始化需求持有者」](http://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom)sWebCoreHandler(以及「WebCoreThread」)的靜態單例初始化。 – Idolon 2011-10-08 16:03:32

+0

@ DroidIn.net:我不太確定,也許它與內存管理有關,也許你的活動被破壞並在兩個不同的線程中重新創建。你向Google提交了一個bug,對吧?所以在某個地方它應該被修復。同時,我不確定這個斷言失敗是否會殺死虛擬機 - 我的意思是,只要靜態處理程序不爲空,您的應用程序應該運行良好,對吧? – 2011-10-12 06:55:20