Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.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
Android 手动杀死javascript线程_Android_Multithreading_Webview - Fatal编程技术网

Android 手动杀死javascript线程

Android 手动杀死javascript线程,android,multithreading,webview,Android,Multithreading,Webview,有可能在安卓系统中杀死线程吗?我看到有一个 Thread.currentThread().destroy(); 然而,这是不赞成的,仍然不适用于我。我现在在中国没有使用VPN,所以无法阅读android开发,但我知道它说在webview中插入的javascript将在单独的线程中运行 问题是,即使webview和片段被销毁,该线程也不会被终止。因此,它继续脚本,即使我希望它被中止/停止/销毁 调用mWebView.destroy;当您想要停止javascript时。活动被破坏后停止播放音乐对我

有可能在安卓系统中杀死线程吗?我看到有一个

Thread.currentThread().destroy();
然而,这是不赞成的,仍然不适用于我。我现在在中国没有使用VPN,所以无法阅读android开发,但我知道它说在webview中插入的javascript将在单独的线程中运行

问题是,即使webview和片段被销毁,该线程也不会被终止。因此,它继续脚本,即使我希望它被中止/停止/销毁

调用mWebView.destroy;当您想要停止javascript时。活动被破坏后停止播放音乐对我来说很有效。我在活动的onDestroy中调用该方法

以下是该方法的文件:

公共空间破坏

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

更新:

我找到了另一个可行的解决办法。它的关键思想是加载另一个url,如果您想停止前一个url中的javascript。因此,您可以在资产中放置一个空白html文件,并在需要停止耗时的javascript时加载它。代码如下:

appWebView.loadUrl("file:///android_asset/infAppPaused.html");
请参阅帖子

更新1: 这篇文章最后给出了解决这个问题的有效方法

在JavaScriptInterface类中添加检查状态方法,并在处理循环期间调用该方法,如果状态不匹配,则退出循环。然后,如果在片段销毁时将状态更改为退出状态,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
}
尝试Thread.currentThread.interrupt;然后将线程设置为null

编辑

根据javadocs,currentThread抓取当前正在执行的thread对象,我假设它抓取正在运行的线程。如果您想更具体地了解正在使用的线程,可以这样做

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

        }
    });

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

编辑哦,我没有注意到整个javascript进入webview的事情。我的错。您可以发布一些当前的实现吗?

线程?如何使线程为空?这不适用于线程。currentThread=null//您可以改为使用runnable和handler。。使用一个布尔值来停止像这个空运行{if!continue{mhandler.postthis}}这样的可运行程序实际上这是我正在寻找的,而不是我搜索解决方案的第2天。寻找实现的方法是。。但是,脚本无论如何都不会在一个独立的无关线程中运行吗?我的意思是只要我从我的处理程序那里运行它?你的意思是我应该如何实现这个?Thread.interrupt如果你不想使用runnable和处理程序,就使用这个。。是的,我已经试过了,它似乎扼杀了webview,但不知何故javascript线程似乎还活着。值得一提的是,webview由一个片段而不是活动容纳。。。。。但您确定在关闭“活动”时脚本已中止吗?它不会秘密地存在于你的应用程序中,在脚本运行完成之前会降低资源的速度。我的脚本大约需要2分钟才能运行,这就是问题所在,即使我终止了webview或脚本的片段,脚本仍会继续运行2分钟。Okej将通读该页面,但加载一个空白URL我已经尝试过了。昨天我发布了一个关于这个的问题,今天我想到了不同的方法来解决它,比如关闭线程等。昨天的帖子:问题是一旦javascript启动,在脚本完成之前,我无法加载一个新的Url,即使是空的。@user3711421哦,我明白了。我认为您不应该使用耗时的javascript,因为它运行在我们无法控制的沙箱中。为什么不先获取页面内容,用本机java代码进行处理,然后将结果发布到WebView,通过此方法可以控制处理。@user3711421我还有另一个解决方案:在JavaScriptInterface类中添加一个check state方法,并在处理循环期间调用该方法,如果状态不匹配,则退出循环。当片段被销毁时,如果将状态更改为退出状态,javascript将停止。如何将线程设置为null?有没有办法知道javascript正在使用哪个线程?目前的线索只是我的猜测。