【问题标题】:android threads: stopping a thread with heavy computationandroid线程:停止计算量大的线程
【发布时间】:2011-07-02 07:20:49
【问题描述】:

我正在我的 android 应用程序中进行一些繁重的计算。因为我不想阻塞 UI 线程,所以我在一个单独的 WorkerThread 中进行计算,它扩展了 Thread。这工作正常。但我无法停止线程。停止线程的正常方法是使用中断()或易失性变量来告诉线程它应该结束。但这仅适用于具有某种循环的线程。我正在使用外部库在线程中进行计算,我无法将 isInterrupted()-check 放入该库中。停止线程的坏方法是使用 stop()-Methode,它已被弃用,但在我的情况下是正确的方法,因为线程只操作内部值。不幸的是,Android 不支持 stop(),因为它不支持已弃用的线程方法。

10-18 10:26:39.382: ERROR/global(13919): Deprecated Thread methods are not supported.
10-18 10:26:39.382: ERROR/global(13919): java.lang.UnsupportedOperationException

你现在有没有其他方法来停止android中的线程? 提前致谢! 托比亚斯

PS:一些代码来显示问题:

public void method()
{
    WorkerThread t = new WorkerThread();
    t.start();
    synchronized (this)
    {
        try
        {
            wait(1000);
        } catch (InterruptedException e)
        {
            Log.e("",e.toString(),e);
        }    
    }

    //t.stop(); //not supported in android
    //t.interrupt(); //can not be checked by the thread    
}

class WorkerThread extends Thread
{
    public void run()
    {
        externalLibrary.heavyComputation();
    }
}

【问题讨论】:

    标签: java android multithreading heavy-computation


    【解决方案1】:

    一般来说,除非您的外部库提供一些协议来停止计算,否则无法优雅地停止计算。许多编写良好的库确实会提供这样的协议,所以看看它的 api。它也可能尊重interrupt() 电话。可能您已经检查过它,但它也可能需要一些时间才能退出。

    【讨论】:

    • 这似乎是对的。我没有发现任何可能。谢谢!
    【解决方案2】:

    看看AsyncTask。这是实现后台任务的更合适和更舒适的方式。 正如您在documentation 中看到的那样:

     private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
         protected Long doInBackground(URL... urls) {
             int count = urls.length;
             long totalSize = 0;
             for (int i = 0; i < count; i++) {
                 totalSize += Downloader.downloadFile(urls[i]);
                 publishProgress((int) ((i / (float) count) * 100));
             }
             return totalSize;
         }
    
         protected void onProgressUpdate(Integer... progress) {
             setProgressPercent(progress[0]);
         }
    
         protected void onPostExecute(Long result) {
             showDialog("Downloaded " + result + " bytes");
         }
     }
    

    【讨论】:

    • 我看不出有任何可能停止异步任务的执行。
    • 看起来这可能有效。这个类有一个 cancel() 方法,看起来它(理论上)做了你想让它做的事情。
    • @Zeychin cancel() 将尝试中断任务,但它不会神奇地停止未响应中断的代码。
    • 我想了很多,但是当我浏览它时,顶级文档似乎没有表明这一点。我想我会指出来,以防万一。
    • @Tobias - 据我了解,您需要进行大量计算并获得结果。在我看来,AsyncTask 是实现此类功能的最佳方式。为什么需要中断线程?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多