我在Android应用程序中做了一些繁重的计算。因为我不想阻止UI线程,所以我在一个单独的WorkerThread中进行计算,这会扩展Thread。这很好用。但我无法阻止线程。停止线程的正常方法是使用interrupt()或volatile变量告诉线程它应该结束。但这只适用于具有某种循环的Threads。我通过使用外部库在线程中进行计算,我不能把isInterrupted() - 检查到这个库中。停止线程的坏方法是使用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();
}
}
答案 0 :(得分:0)
看看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");
}
}
答案 1 :(得分:0)
通常,除非您的外部库提供一些停止计算的协议,否则无法正常停止它。许多编写良好的库都会提供这样的协议,所以看看它的api。它也可能会尊重interrupt()
电话。可能你已经检查了它,但它可能还需要一些时间才能退出。