如果以前的加载没有完成javascript,则无法在对话框片段中加载Webview

时间:2015-02-25 08:27:52

标签: android webview

我在对话框片段中使用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在另一个线程中运行而不是”,这意味着我必须找到一种杀死/停止该线程的方法!我还不能阅读整个页面,因为我在中国已经有一段时间了,谷歌在这里被封锁了。

1 个答案:

答案 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();
}

参考:WebView stopLoading()