2016-10-24 8 views
10

Obecnie pracuję nad wykresem danych za pośrednictwem d3 do widoku WWW. Oczywiście, wszystko się psuje, jak tylko próbuję przeładować wykres i przekazać mu nowe dane. Ta urocza linia wciąż pojawia się: W/cr_BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid.Czy ktoś mógłby raz na zawsze wyjaśnić Nie można wywołać definedVisibility() - nigdy nie widziałem połączenia dla pid

Spytałem SO o wyjaśnienie, ale wydaje się, że nic nie jest rozstrzygające. Ludzie sugerują tylko włączenie pamięci DOM w ustawieniach wyświetlania stron internetowych (co oczywiście nie rozwiązuje problemu). Podejrzewam, że pomiędzy ponownym załadowaniem wykresu i podawaniem nowych danych istnieje warunek wyścigu. Nadpisałem na stroniePageFinished() w moim WebViewClient, aby zadzwonić do słuchacza, aby załadować dane do wykresu, myśląc, że to rozwiąże warunki wyścigu, ale bez skutku.

Czy ktoś może mi wyjaśnić, co oznacza W/cr_BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid? Czy jestem w mojej ocenie? Jak mogę to debugować?

Wszelkie wskazówki są mile widziane.

EDYCJA: Rozwiązałem pierwotny numer, ale nadal chciałbym dowiedzieć się, co oznacza ta linia. Bounty up.

+0

Czy możesz dodać kod źródłowy, aby pokazać, jak nazywasz wykres?Ponadto, ile danych przekazujesz? – SJoshi

Odpowiedz

6

Kolejne połączenia z numerem loadUrl powodują stan wyścigu. Problem polega na tym, że loadUrl("file://..") nie kończy się natychmiast, więc gdy zadzwonisz pod numer loadUrl("javascript:.."), będzie on czasami wykonywany przed załadowaniem strony.
ten sposób konfiguracji i moje webview:

wv = (CustomWebView) this.findViewById(R.id.webView1); 

WebSettings wv_settings = wv.getSettings(); 

//this is where you fixed your code I guess 
//And also by setting a WebClient to catch javascript's console messages : 

wv.setWebChromeClient(new WebChromeClient() { 
     public boolean onConsoleMessage(ConsoleMessage cm) { 
      Log.d(TAG, cm.message() + " -- From line " 
        + cm.lineNumber() + " of " 
        + cm.sourceId()); 
      return true; 
     } 
    }); 
wv_settings.setDomStorageEnabled(true); 

wv.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onPageFinished(WebView view, String url) { 
      super.onPageFinished(view, url); 
      setTitle(view.getTitle()); 
      //do your stuff ... 
      } 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     if (url.startsWith("file")) 
     { 
      // Keep local assets in this WebView. 
      return false; 
     } 
     } 
    }); 

//wv.setWebViewClient(new HelpClient(this));// 
wv.clearCache(true); 
wv.clearHistory(); 
wv_settings.setJavaScriptEnabled(true);//XSS vulnerable 
wv_settings.setJavaScriptCanOpenWindowsAutomatically(true); 
wv.loadUrl("file:///android_asset/connect.php.html"); 

UWAGA ta linia wv.setWebChromeClient(new WebChromeClient());

Na poziomie API 19 (Android 4.4 KitKat), silnik przeglądarka przełączane z Android webkit do chromium webkit, z prawie całym oryginalnym WebViewAPI's zawiniętym do blatu części chromium webkit.

To jest metoda że daje błąd (BindingManagerImpl.java), z Chromium source:

@Override 
public void determinedVisibility(int pid) { 
    ManagedConnection managedConnection; 
    synchronized (mManagedConnections) { 
     managedConnection = mManagedConnections.get(pid); 
    } 
    if (managedConnection == null) { 
     Log.w(TAG, "Cannot call determinedVisibility() - never saw a connection for the pid: " 
       + "%d", pid); 
     return; 
    } 


Jest to renderingu ostrzeżenie z treści.
Możesz odkopać na zawsze ten kod źródłowy github, może być miło zobaczyć, gdzie metoda determinedVisibility (w BindingManagerImpl.java) jest wywoływana z ... (przyrostek "Impl" dla implementacji). Mam nadzieję, że to pomaga; O)

+0

Dzięki. To z pewnością rzuca trochę światła na logikę tego komunikatu. – Vas

+0

@Vas Dzięki za nagrodę Vas, możesz przekopać się w nieskończoność w tym kodzie źródłowym githuba, może miło byłoby zobaczyć, skąd wzięła się metoda, o której wspomniałem, może, jeśli mam trochę czasu .... –

2

Zwykle pojawia się, gdy nadpisujesz metodę shouldOverrideUrlLoading().

Z moich aplikacji WebView na wcześniejszych aplikacjach wynika to z tego, co jest renderowane w WebView, co jest przechwytywane w powyższej metodzie, a następnie ignorowane. Widzę to bardzo, gdy ładowane strony próbują załadować skrypty spoza dozwolonej domeny.

Powiązane problemy