Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript WebView加载URL的速度比phone慢10倍';s浏览器_Javascript_Android_Webview - Fatal编程技术网

Javascript WebView加载URL的速度比phone慢10倍';s浏览器

Javascript WebView加载URL的速度比phone慢10倍';s浏览器,javascript,android,webview,Javascript,Android,Webview,我一直在努力解决这个问题,但还没有找到解决办法 在我的应用程序中,我通过一个不可见的WebView组件提取网站的HTML。我不需要查看该网站,只需要获取它加载的html。该网站使用JavaScript加载其所有内容,因此我需要一个完整的web渲染器来执行该JavaScript。在其当前形式中,我覆盖了WebViewClient的onPageFinished方法,以注入JavaScript,将html转储到JavaScriptInterface中,然后由JavaScriptInterface进行处

我一直在努力解决这个问题,但还没有找到解决办法

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

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

如果可能有帮助的话,执行的JavaScript会在WebView中存储一个cookie,然后尝试检索它,并且只有在找到该cookie(其过期时间很短)时才会加载站点的HTML。在本例中,它实际上加载了JSON格式的数据(大约370k个字符)

相关网络视图代码:

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);");
        }
    });
}
什么时候它是可见的


试试看

调用onPageFinished之前是8秒吗?@greenaps从我调用webView.loadUrl的点到我通过onPageFinished
获得“页面加载完成”的点是8秒,执行的JavaScript存储cookie
。但是在调用onPageFinished之前没有执行javascript,是吗?否则该代码将丢失。@greenapps此特定网站中嵌入的是JavaScript,而不是我编写的代码。请确认或拒绝:
但在调用onPageFinished之前没有执行JavaScript,是吗?
。我无法解释原因,但再次打开WebView可以解决此问题。也许这与运行时优化有关,它会减慢不可见组件的速度?无论如何,再次谢谢你!认为调度程序对后台进程的优先级较低。
  through an invisible WebView component..