2016-10-24 6 views
10

В настоящее время я работаю над графическим представлением данных через d3 в webview. Естественно, что все ломается, как только я пытаюсь перезагрузить график и передать его новым данным. Эта прекрасная линия продолжает появляться: W/cr_BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid.Может ли кто-то раз и навсегда объяснять причину Невозможно называть definVisibility() - никогда не видел соединение для pid

Я искал SO для объяснения, но, похоже, нет ничего убедительного. Люди просто предлагают включить хранилище DOM в настройках веб-просмотра (что, очевидно, не устраняет проблему). Я подозреваю, что есть условие гонки между перезагрузкой графика и подачей его новых данных. Я переопределил onPageFinished() в своем WebViewClient, чтобы вызвать слушателя для загрузки данных в диаграмму, считая, что это разрешит состояние гонки, но безрезультатно.

Может кто-нибудь, пожалуйста, объясните мне, что означает W/cr_BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid? Неужели я в своей оценке? Как я могу его отладить?

Любые советы приветствуются.

EDIT: Я решил исходную проблему, но мне все равно хотелось бы узнать, что означает эта линия. Баунти вверх.

+0

Можете ли вы добавить исходный код, чтобы показать, как вы звоните в диаграмму?Кроме того, сколько данных вы передаете? – SJoshi

ответ

6

Последовательные звонки в loadUrl вызывают состояние гонки. Проблема заключается в том, что loadUrl("file://..") не завершается сразу, поэтому при вызове loadUrl("javascript:..") он будет выполняться до загрузки страницы.
Это, как мне настроить мой 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"); 

Примечание эта линия wv.setWebChromeClient(new WebChromeClient());

В уровне API 19 (Android 4.4 KitKat), то движок браузера переключается с Android webkit на chromium webkit, с почти всем оригиналом WebViewAPI's завернутый в стойку части chromium webkit.

Это является метод, что дает ошибку (BindingManagerImpl.java), из 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; 
    } 


Это рендеринга предупреждение от содержания.
Вы можете копаться навсегда в этом исходном коде github, может быть приятно увидеть, где метод determinedVisibilityBindingManagerImpl.java) вызывается из ... (суффикс «Impl» для реализации). Надеюсь, что это поможет; O)

+0

Спасибо. Это, безусловно, проливает некоторый свет на логику этого сообщения журнала. – Vas

+0

@Vas Спасибо за щедрость Вас, вы можете копаться навсегда в этом исходном коде github, может быть приятно посмотреть, откуда вызван метод, о котором я говорил, может быть, если я получу некоторое время .... –

2

Обычно это появляется, когда вы переопределяете метод shouldOverrideUrlLoading().

Из моих приложений WebView в предыдущих приложениях это происходит из-за того, что отображается в WebView, что поймано по вышеуказанному методу и, в свою очередь, игнорируется. Я вижу это много, когда загружаемые веб-сайты пытаются загрузить скрипты за пределами разрешенного домена.

 Смежные вопросы

  • Нет связанных вопросов^_^