不幸的是,我不能可靠地重现这个错误,但很少我得到它,偶尔也会在实时崩溃日志中报告。这是用户使用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
提交的答案 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是在主线程中调用,你应该很好。