我在对话框片段中使用webview。当我按下一个按钮时,webview加载了一个URL,而不是运行javascript(javascript大约需要2分钟,具体取决于webview中的URL)。
到目前为止一切顺利。但是,如果我在javascript运行时反对对话碎片而不是再次打开对话碎片我再也无法加载webview了。事实上,如果我执行上述操作,可以加载非我的webview,即使是不同片段的webview,它们也只是空白。
但如果我让脚本完成,一切正常,我可以加载另一个URL或在另一个片段中打开另一个webview。
所以我认为当我在对话框片段中反印并中止javascript加载时,webview不会被完全破坏。
我从Log.i了解到对话片段onDestroy会在backpress上调用。这就是该方法的样子。
@Override
public void onDestroy() {
super.onDestroy();
Log.i("DialogFragment", "onDestory");
preViewHtml.destroy();
}
但我也试图关闭/删除我能想到的一切。
@Override
public void onDestroy() {
super.onDestroy();
Log.i("CONVERTERDIlog", "onDestory");
preViewHtml.removeJavascriptInterface("MyJavaScript");
preViewHtml.clearHistory();
preViewHtml.clearCache(true);
preViewHtml.loadUrl("about:blank");
preViewHtml.pauseTimers();
preViewHtml.destroy();
}
任何想法如何解决这个问题?
修改 它实际上似乎最终加载,但第二次有一个巨大的延迟。第一次webview在2秒后加载(并且脚本在2分钟内完成),第二次如果我在脚本完成之前中止视图,延迟大约需要1分钟来加载webview(加载视图后的脚本时间不受影响)。 / p>
就像脚本继续在webview上加载一样即使我关闭了那个片段(背压),我还要等到脚本从之前完成才能加载另一个webview。但我希望脚本在webview被破坏时停止。
这是我的脚本方法,程序似乎一直存在并且需要完成(不能因某种原因而中止)。
private void colorizeHtmlWithJavaScript() {
preViewHtml.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
view.loadUrl("javascript:(function() { " +
"var alpha = 'abcdefghijklmnopqrstuvwxyz'.split('');" +
//A long for loop using alpha on an HTML, //I think it is this loops which continues to run somehow. +
"})()");
}
});
以及我如何设置webview。
private void setUpWebView() {
preViewHtml = (WebView) theView.findViewById(R.id.webView2);
preViewHtml.getSettings().setJavaScriptEnabled(true);
preViewHtml.addJavascriptInterface(new MyJavaScriptInterface(theView.getContext()), "HtmlViewer");
}
This person似乎与我有同样的问题,但没有答案。 在google Dev上,我可以看到他们写的“你的JavaScript在另一个线程中运行而不是”,这意味着我必须找到一种杀死/停止该线程的方法!我还不能阅读整个页面,因为我在中国已经有一段时间了,谷歌在这里被封锁了。
答案 0 :(得分:0)
使用preViewHtml.stopLoading();
,因此将destroy()方法重写为
@Override
public void onDestroy() {
super.onDestroy();
Log.i("DialogFragment", "onDestory");
preViewHtml.loadUrl("about:blank");
preViewHtml.stopLoading();
preViewHtml.setWebChromeClient(null);
preViewHtml.setWebViewClient(null);
preViewHtml.destroy();
preViewHtml= null;
}
还暂停和恢复webview
@Override
public void onPause() {
super.onPause();
preViewHtml.onPause();
preViewHtml.pauseTimers();
}
@Override
public void onResume() {
super.onResume();
preViewHtml.onResume();
preViewHtml.resumeTimers();
}