手动杀死javascript线程

时间:2015-02-26 06:27:44

标签: android multithreading webview

是否可以杀死android中的线程我看到有一个

Thread.currentThread().destroy();
然而,

已被弃用,但仍不适用于我。我现在在中国没有工作VPN,所以无法读取Android开发,但我知道它说,在webview中插入的javascript将在一个单独的线程中运行。

问题是即使webview和片段被破坏,这个线程也不会被杀死。所以它继续脚本,即使我希望它被中止/停止/销毁(无论如何)。

2 个答案:

答案 0 :(得分:0)

如果要停止javascript,请致电mWebView.destroy();。在Activity被破坏后,我可以停止播放音乐。我在我的活动的onDestroy()中调用该方法。

以下是该方法的文件:

  

public void destroy()

     

在API级别1中添加了破坏此WebView的内部状态。这个   此WebView已从中删除后应调用该方法   查看系统。之后,此WebView上不会调用其他任何方法   破坏。

<强>更新

我找到了另一个有效的解决方案。它的主要想法是,如果你想停止前一个网址中的javascript,请加载另一个网址。因此,您可以在资产中放置一个空白的html文件,并在您想要停止耗时的javascript时加载它。像这样的代码:

appWebView.loadUrl("file:///android_asset/infAppPaused.html");

请参阅帖子here

更新1: 这篇文章中最终解决问题的解决方案。

在JavaScriptInterface类中添加一个check state方法,并在处理循环期间调用该方法,如果state不匹配则退出循环。然后,如果在片段被破坏时将状态更改为“退出状态”,则javascript将停止。

以下是代码示例:

private boolean webviewAlive = true;
public class JavaScriptInterface {

    @JavascriptInterface
    public boolean checkState() {
        return webviewAlive;
    }

}

// Init WebView 
mWebView.addJavascriptInterface(new JavaScriptInterface(),
        "HtmlViewer");

// To stop the javascript loop
webviewAlive = false;

// Call check state method in javascript loop
if(!window.HtmlViewer.checkState()){
    // break the javascript
}

答案 1 :(得分:0)

尝试Thread.currentThread().interrupt();,然后将您的主题设置为空。

修改

根据javadocs,currentThread()抓住了“当前正在执行的线程对象”,我假设它正在运行时抓取你的线程。如果您想更具体地了解您正在使用的线程,可以执行

    //get a reference
    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {

        }
    });

    //kill the thread
    t.interrupt();
    t = null;

编辑哦,呃,我没有注意到整个“javascript into webview”的事情。我的错。你可以发布一些当前的实现吗?