有人可以一劳永逸地解释不能调用determinVisibility() - 从未看到pid的连接

时间:2016-10-24 20:46:05

标签: javascript android d3.js android-webview chromium

我目前正致力于通过d3将数据绘制到webview中。当然,一旦我尝试重新加载图表并提供新数据,事情就会破裂。这条可爱的线条不断出现:W/cr_BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid

我已经搜索了SO以获得解释,但似乎没有任何结论。人们只是建议在webview设置中打开DOM存储(这显然无法解决问题)。我怀疑在重新加载图表和提供新数据之间存在竞争条件。我在我的WebViewClient中重写了onPageFinished()来调用监听器将数据加载到图表中,认为它可以解决竞争条件,但无济于事。

有人可以向我解释W/cr_BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid的含义吗?我评价过了吗?我该如何调试呢?

任何提示都表示赞赏。

编辑:我已经解决了原始问题,但我仍然希望了解这条线的含义。赏金。

2 个答案:

答案 0 :(得分:7)

连续拨打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,几乎所有原始WebView } API's包裹在chromium webkit的对应部分。

方法,它提供来自{{3}的错误 BindingManagerImpl.java ) }:

@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源代码中永远挖掘,可能很高兴看到方法determinedVisibility(在BindingManagerImpl.java中)从哪里调用...(后缀“Impl”用于实现) 。 希望这会有所帮助; O)

答案 1 :(得分:2)

当您覆盖方法shouldOverrideUrlLoading()时,通常会弹出。

从我之前的应用程序的WebView用法来看,这是由于在WebView上呈现的内容,上面的方法被捕获的内容反过来被忽略了。 当我加载的网站试图在允许的域之外加载脚本时,我看到了很多。