我已经想了很长一段时间了,但还没有找到解决方案。
在我的应用程序中,我通过一个不可见的WebView组件提取网站的HTML。我不需要查看网站,只需获取它加载的html即可。该网站使用JavaScript加载其所有内容,因此我需要一个完整的网络渲染器来执行该JavaScript。在目前的形式中,我正在重写WebViewClient的onPageFinished方法,以注入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..
当它可见时怎么办?
试试看!