WebView加载网址比手机的Chrome浏览器

时间:2016-08-18 12:00:45

标签: javascript android webview

我一直试图将这个问题弄清楚了一段时间,但尚未找到解决方案。

在我的应用程序中,我通过不可见的WebView组件提取网站的HTML。我不需要查看网站,只需获取它加载的HTML。该网站使用JavaScript加载其所有内容,因此我需要一个完整的Web渲染器才能执行该JavaScript。在目前的形式中,我将覆盖WebViewClient的onPageFinished方法,以注入将html转储到JavaScriptInterface然后处理它的JavaScript。

我的主要问题是,当我在我的应用程序中加载此URL时,大约需要8秒钟,而在手机的Chrome浏览器中加载完全相同的URL需要不到一秒钟。关于可能出现什么问题的任何建议?

如果它可能有任何帮助,那么执行的JavaScript会在WebView中存储一个cookie,然后尝试检索它,并且只有当它找到所述cookie(其有一个很短的过期时间)时才会加载该网站& #39;的HTML。在这种情况下,它实际上加载了使用JSON格式化的数据(大约370k个字符)。

相关的WebView代码:

private void initWebView(View view) {
    class JSInterface{
        @JavascriptInterface
        public void processHTML(String scheduleJSONResponse){
            if(scheduleJSONResponse.length() > 10000){
                Log.d(LOG_TAG, "Finished loading JSON");
            }
        }
    }
    webView = (WebView) view.findViewById(R.id.fragment_movies_web_view);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.addJavascriptInterface(new JSInterface(), "Android");
    webView.setWebViewClient(new WebViewClient(){
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            Log.d(LOG_TAG, "Page finished loading");
            webView.loadUrl("javascript:window.Android.processHTML(document.getElementsByTagName('html')[0].textContent);");
        }
    });
    webView.loadUrl(url);
}

至于为什么我检查长度超过10k个字符:有时onPageFinished会被多次调用,第一次调用是在执行JavaScript之前,所以我得到包含要执行的脚本的HTML #39; t我需要的东西。

提前感谢您的帮助!

用于演示此问题的logcat:

08-18 22:32:23.623 26238-26238/com.michaelsvit.kolnoa I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@1e4dc08f time:502735009
08-18 22:32:23.638 26238-26238/com.michaelsvit.kolnoa W/cr_BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid: 26238
08-18 22:32:31.336 26238-26238/com.michaelsvit.kolnoa D/MovieGridFragment: Page finished loading

简化后的当前代码:

private void initWebView(View view) {
    class JSInterface{
        @JavascriptInterface
        public void processHTML(String scheduleJSONResponse){
            if(scheduleJSONResponse.length() > 10000){
                Log.d(LOG_TAG, "Finished loading JSON");
            }
        }
    }
    webView = (WebView) view.findViewById(R.id.fragment_movies_web_view);
    webView.getSettings().setJavaScriptEnabled(true);
    //webView.addJavascriptInterface(new JSInterface(), "Android");
    webView.setWebViewClient(new WebViewClient(){
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            Log.d(LOG_TAG, "Page finished loading");
            //webView.loadUrl("javascript:window.Android.processHTML(document.getElementsByTagName('html')[0].textContent);");
        }
    });
}

1 个答案:

答案 0 :(得分:2)

  through an invisible WebView component.. 

何时可见?

试试吧!