取消HTTP下载器AsyncTask的最佳方法

时间:2014-12-19 11:21:24

标签: android multithreading android-asynctask interrupt

我有一些AsyncTasks从网络下载数据。如果在某一点我需要阻止它们,那么最好的方法是什么呢? 有关以下内容的文档:

task.cancel(mayInterruptIfRunning)

表示:

  

尝试取消执行此任务。如果这种尝试失败了   任务已经完成,已经取消,或者不能   由于其他原因被取消。如果成功,这个任务就有了   调用cancel时未启动,此任务永远不会运行。如果   任务已经启动,然后是mayInterruptIfRunning参数   确定执行此任务的线程是否应该是   因试图停止任务而中断。

     

调用此方法将导致调用onCancelled(Object)   在doInBackground(Object [])返回后的UI线程上。打电话给这个   方法保证永远不会调用onPostExecute(Object)。后   调用此方法时,应检查返回的值   isCancelled()定期从doInBackground(Object [])来完成   任务尽早完成。

从中我明白了,如果mayInterruptIfRunning = true,它会尝试中断线程但是如果它没有成功,则必须在后台流上连续检查isCancelled()。
这是HTTP案例。我在某处读到Thread.interrupt实际上并没有中断IO操作,但是这就是cancel()失败的情况。
因此如何中止下载?

这里有一些我认为的可能性:

  1. 使用ApacheHttp *:覆盖cancel(boolean)方法并调用新的取消(。),如httpUriRequestInstance.abort()
  2. 使用HttpURLConnection:我可以获取inputStream并填充另一个缓冲的输出流,以便定期检查与isCancelled()相关联的标志。我的意思是:

    ... httpURLConnection code which creates an HttpURLConnection "conn"  
    InputStream in = conn.getInputStream();  
    ByteArrayOutputStream baos = new ByteArrayOutputStream(defSize);   
    byte[] buff = new byte[buffSize];  
    int br;  
    while( (br = in.read(buff) ) >-1){  
      if(cancelled) return null; //eventually closing th inpustream  
     baos.write(buffer,0,br);  
    }  
    // ...  
    
  3. 你有什么建议吗?

1 个答案:

答案 0 :(得分:3)

我绝对会选择HttpURLConnection。并且可能会做类似的事情:

  1. 将一个public void cancel()方法添加到我的自定义AsyncTask中 实施
  2. 实施cancel()

    public void cancel() { this.cancel(true); mConnection.disconnect(); // TODO try close input stream }

  3. 在我的活动中,在需要时致电mMyAsyncTask.cancel()