Android bug:WebViewCore因Assertion错误而失败

时间:2011-04-20 17:21:01

标签: android

不幸的是,我不能可靠地重现这个错误,但很少我得到它,偶尔也会在实时崩溃日志中报告。这是用户使用Droid 2.2.2 FRG83G

报告的堆栈跟踪
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。这是作为错误#16258

提交的

1 个答案:

答案 0 :(得分: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子句之外和在一个同步子句中创建和启动的新线程内部运行,假设只有一次。

您的错误似乎与并发创建Web视图有关。如果您的应用程序只有一个带有一个webview的活动,请确保不会经常调用此活动(=一次一个),即在onCreate方法而不是活动构造函数中创建WebView,startActivity是在主线程中调用,你应该很好。