我有一些AsyncTasks从网络下载数据。如果在某一点我需要阻止它们,那么最好的方法是什么呢? 有关以下内容的文档:
task.cancel(mayInterruptIfRunning)
表示:
尝试取消执行此任务。如果这种尝试失败了 任务已经完成,已经取消,或者不能 由于其他原因被取消。如果成功,这个任务就有了 调用cancel时未启动,此任务永远不会运行。如果 任务已经启动,然后是mayInterruptIfRunning参数 确定执行此任务的线程是否应该是 因试图停止任务而中断。
调用此方法将导致调用onCancelled(Object) 在doInBackground(Object [])返回后的UI线程上。打电话给这个 方法保证永远不会调用onPostExecute(Object)。后 调用此方法时,应检查返回的值 isCancelled()定期从doInBackground(Object [])来完成 任务尽早完成。
从中我明白了,如果mayInterruptIfRunning = true,它会尝试中断线程但是如果它没有成功,则必须在后台流上连续检查isCancelled()。
这是HTTP案例。我在某处读到Thread.interrupt实际上并没有中断IO操作,但是这就是cancel()失败的情况。
因此如何中止下载?
这里有一些我认为的可能性:
httpUriRequestInstance.abort()
。 使用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);
}
// ...
答案 0 :(得分:3)
我绝对会选择HttpURLConnection
。并且可能会做类似的事情:
实施cancel()
为
public void cancel() {
this.cancel(true);
mConnection.disconnect();
// TODO try close input stream
}
在我的活动中,在需要时致电mMyAsyncTask.cancel()