2011-04-20 5 views
3

불행히도이 오류를 신뢰할 수없이 재현 할 수는 없지만 때로는 생동감있는 로그에서보고되기도합니다. 여기에 스택 트레이스 인해 android.os.Handler의 개인 정적 인스턴스가 하지 (감사 @Idolon입니다 어떻게 든 WebViewCore.javaAndroid 버그 : WebViewCore가 어설 션 오류로 인해 실패합니다.

Assert.assertNull(sWebCoreHandler); 

sWebCoreHandler에서이 라인에 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) 
이 될 것으로 보인다

와 사용자에 의해보고 된 것 수정을 위해)이미 초기화되었지만이 문제를 해결하거나 해결하는 방법에 대한 단서가 없습니다.

이것은 종종 걱정하기에 충분합니다. 흥미로운 점은 앱에 Activity이로드되어 있는데 액티비티 중 하나에도 WebView가 없어도 겉으로보기에는 문제가 발생한다는 것입니다.

P. 이것은

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 생성자에서 온다 ... 버그 # 유죄 소스 코드를 보면 16258

+0

? 너 정확히 원하는게 뭐야? 웹뷰에 "특별한"것이 있는지 알려줄 수 있습니까? –

+0

나는 누군가가 내게 무엇이 문제인지, 그것을 피하는 방법을 설명하기를 원해. "내"webview에는 특별한 것이 없으며 코드를 실행할 때이 버그를 재현 할 수는 없지만 ACRA 로그가 가득 찼습니다. 그리고 이것은 완전한 스택 추적입니다. – Bostone

+0

코드에서 어떤 줄이 문제를 일으키는 지 알 수 있습니까? 6 개월 만에이 버그를보고 한 유일한 사람이라면 코드의 버그 일 수 있습니다. – slayton

답변

3

으로 제기되었다 sWebCoreHandler이 null 일 때이 어설 션은 결코 실패하지 않아야합니다 ... 이론적으로. 그것은 synchronized 절 외부에서 실행되었고 synchronized 절 내에서 생성되고 시작된 새 스레드 내부에서 실행되었습니다 (단 한 번만).

웹 뷰를 동시에 생성하는 데 오류가있는 것으로 보입니다. 애플리케이션에 하나의 웹 뷰가있는 활동이 하나만있는 경우이 액티비티가 필요 이상 (= 한 번에 하나씩)으로 호출되지 않고, WebView가 액티비티 생성자가 아닌 onCreate 메소드에서 생성되고, startActivity가 메인 스레드에서 호출, 당신은 잘해야합니다.

+0

이것들은 유효하고 유효하지만, 코드의 하나의 WebView가 onCreate 작업 방법으로 초기화됩니다. 이것이 중지/다시 시작하거나 일시 중지/활동을 활성화하고 어떻게 든 정적 싱글 톤을 잃는 것과 관련이 있는지 궁금합니다. ?? – Bostone

+1

OMG ... 그런 순진한 동기화. 다른 스레드에서 2 개의 WebView를 생성하려고하면 어설 션 오류가 발생할 수 있습니다. 그들은 'sWebCoreHandler' (및 "WebCoreThread")의 정적 싱글 톤 초기화에 대해 [ "Initialization on demand holder"] (http://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom) 관용구를 사용해야합니다. – Idolon

+0

@ DroidIn.net : 정말로 잘 모르겠다. 어쩌면 메모리 관리와 관련이있다. 어쩌면 당신의 활동이 파괴되어 다른 두 개의 스레드에서 재현 될 수도있다. 너는 구글에 버그를 신청 했지, 그렇지? 길 아래 어딘가에 고정시켜야합니다.그 동안이 어설 션 오류로 인해 VM이 죽는 지 확실하지 않습니다. 정적 처리기가 null이 아닌 한 앱이 정상적으로 실행되어야합니다. 그렇습니까? –

관련 문제