javascript - WebView 加载 URL 比手机的 Chrome 浏览器慢 10 倍

标签 javascript android webview

我已经尝试解决这个问题很长一段时间了,但还没有找到解决方案。

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

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

如果有任何帮助,执行的 JavaScript 会在 WebView 中存储一个 cookie,然后尝试检索它,只有当它找到所述 cookie(过期时间很短)时,它才会加载站点的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 '我需要的。

在此先感谢您的帮助!


用于演示问题的 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);");
        }
    });
}

最佳答案

  through an invisible WebView component.. 

什么时候可见?

试试吧!

关于javascript - WebView 加载 URL 比手机的 Chrome 浏览器慢 10 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39017698/

相关文章:

javascript - 在 JavaScript ES6 中使用对象作为索引数组是一个好的模式吗?

javascript - Bootstrap 和 JavaScript : sequence of commands

php - 如何使用 volley api 将 android 应用程序连接到本地服务器

javascript - 如何获取 Android WebView 中从顶部到 div block 的像素数量?

javascript - 通过触摸拖动一个 div - 非常慢

javascript - 无效的 JSON 解析器错误

安卓.mk : Unsupported source file extensions for C files

android - imageloader 类显示比通常尺寸更小的图像

android - 如何让 webview Android 应用程序不显示 adsense 广告?

android - XML 启动画面 -> 显示 Webview