如何在安卓中安全地停止线程?

4

如何安全地停止线程?

 downloadThread = new Thread(new Runnable() {

   @Override
   public void run() {

  });
  downloadThread.start();
 }

1
这是一个常见问题,有很多好的答案,比如这个:如何在Java中快速且干净地中止一个线程 - Andreas Dolk
3个回答

3

使用Android SDK的 AsyncTask 来执行后台任务,而不是使用普通线程。在这里可以找到一个 cancel() 方法。


28
这并没有回答问题。 - Trevor
AsyncTask在API级别30中已被弃用。 - cesargastonec

3

中断线程。在线程的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);
    }
}

哇哦!老问题!从未意识到。 - Vikram Bodicherla
你能举个例子,说明一下你所建议的做法吗? - Gaurav Agarwal
请注意从isInterrupted()更改为isCancelled()。isInterrupted()是Thread上的一个方法,而不是AsyncTask。抱歉。 - Vikram Bodicherla

0

最简单的方法似乎是将isRunning设置为false。


我需要通用解决方案,而不是针对此问题的解决方案。 - Srinivas
相似的解决方案是我多次使用的方法。while(do_run()){做一些事情} - dutt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接