【问题标题】:How to stop thread safely in android? [duplicate]如何在android中安全地停止线程? [复制]
【发布时间】:2011-05-12 11:38:30
【问题描述】:

如何安全地停止线程?

 downloadThread = new Thread(new Runnable() {

   @Override
   public void run() {

  });
  downloadThread.start();
 }

【问题讨论】:

标签: java android


【解决方案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()) { 做事 }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多