如何在android中安全地停止线程? [复制]
Posted
技术标签:
【中文标题】如何在android中安全地停止线程? [复制]【英文标题】:How to stop thread safely in android? [duplicate] 【发布时间】:2011-05-12 11:38:30 【问题描述】:如何安全地停止线程?
downloadThread = new Thread(new Runnable()
@Override
public void run()
);
downloadThread.start();
【问题讨论】:
这是一个常见的问题,经常有这样的好答案:How to abort a thread in a fast and clean way in Java 【参考方案1】:如果您将使用 android sdk 的 AsyncTask
,而不是使用普通线程来执行后台作业,您可以在那里找到 cancel()
。
【讨论】:
这不是在回答问题。 AsyncTask 在 API 级别 30 中已被弃用。【参考方案2】:中断线程。在线程的run()
方法中,查看不同逻辑块末尾isInterrupted()
的值。
例如,假设您的 run()
方法可以分为三个逻辑步骤
- 创建网络连接,下载图像并将图像保存到文件中。在每个步骤结束时,检查isCancelled()
并停止操作,丢弃此时的所有状态。
class NetworkFetcherTask extends AsyncTask<String, Void, Void>
public void doInBackground(String... params)
String url = params[0];
//Open connection if not cancelled
if(isCancelled())
conn.close();
return;
NetworkConnection conn = new NetworkConnection();
//Download the image if not cancelled
if(isCancelled())
conn.close();
result.discard();
return;
NetworkResult result = conn.fetchUrl(url);
conn.close();
//Save the image to a file if not cancelled
if(isCancelled())
result.discard();
return;
File file = new File();
file.dump(result);
【讨论】:
哇!老问题!从未意识到 你能举个例子吗,你建议怎么做? 你去。请注意从 isInterrupted() 到 isCancelled() 的变化。 isInterrupted() 是线程上的方法,而不是 AsyncTask。我很抱歉。【参考方案3】:最简单的方法似乎是将 isRunning 设置为 false。
【讨论】:
我需要通用解决方案,不是为了这个。 类似的解决方案是我多次使用的一种方法。 while(do_run()) 做事以上是关于如何在android中安全地停止线程? [复制]的主要内容,如果未能解决你的问题,请参考以下文章