如何在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中安全地停止线程? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

腾讯一面:如何正确停止一个线程?

Android - 停止线程的最佳和安全方法

腾讯面试官:如何停止一个正在运行的线程?我一脸蒙蔽。。。

腾讯面试官:如何停止一个正在运行的线程?我蒙了。。。

腾讯面试官:如何停止一个正在运行的线程?我蒙了。。。

腾讯面试:如何优雅停止一个正在运行的线程?我一脸蒙蔽。。。