安卓停止下载
Posted
技术标签:
【中文标题】安卓停止下载【英文标题】:Android stop download 【发布时间】:2011-02-06 16:14:50 【问题描述】:在我的应用程序中,我下载并解析了一个 html 页面。但是,我希望能够在其轨道中停止下载(即当用户点击取消时)。
这是我现在使用的代码,它是从 ASyncTask 的 doInBackground 调用的。
如何从 ASyncTask 外部取消此请求?
我目前使用htmlcleaner
HtmlCleaner cleaner = new HtmlCleaner();
CleanerProperties props = cleaner.getProperties();
props.setAllowHtmlInsideAttributes(true);
props.setAllowMultiWordAttributes(true);
props.setRecognizeUnicodeChars(true);
props.setOmitComments(true);
try
URL url = new URL(urlstring);
URLConnection conn = url.openConnection();
TagNode node = cleaner.clean(new InputStreamReader(conn.getInputStream()));
return node;
catch (Exception e)
failed = true;
return;
【问题讨论】:
【参考方案1】:你不能用AsyncTask.cancel()
吗?然后您应该能够使用onCancelled
回调返回到主要活动..
【讨论】:
这也会自动停止下载吗?我使用 URLConnection 类进行下载。 不,事实证明它不会(文档对此有误 - 调用AsyncTask.cancel(true)
不会阻止任务实际运行。您可以发布代码以实际进行下载吗?
我已将其添加到问题中。感谢您的麻烦!【参考方案2】:
好的,我相信我已经解决了这个问题。
在我的 Activity 类中,我有一个变量(布尔值)failed
。另外,我在活动中有一个私有的Downloader
类,它扩展了ASyncTask
。这样,Downloader
类就可以访问failed
布尔值。当 Activity 启动时,它会启动 Downloader
任务并弹出一个进度对话框。任务完成后,它会关闭对话框,然后继续处理下载的内容。
但是,当用户取消进度对话框时,failed
设置为 true,并且通过调用 finished
将用户送回上一个活动。与此同时,Downloader
还在忙着下载。因为结果现在是不必要的,我们希望它尽快停止使用资源。为了实现这一点,我已将doInBackground
方法分解为尽可能多的步骤。在每一步之后,我检查failed
是否仍然是false
,当它设置为true
时,它根本不会进入下一步。请参阅下面的实际操作。此外,BufferedReader reader
是公开的,在onCancelled
方法中我执行reader.close()
。这将引发各种异常,但这些异常被正确捕获。
public void DoInBackground(.........)
try
URL url = new URL(uri);
URLConnection conn = url.openConnection();
if (!failed)
isr = new InputStreamReader(conn.getInputStream());
if (!failed)
reader = new BufferedReader(isr);
publishProgress(1);
if (!failed)
TagNode node = cleaner.clean(reader);
publishProgress(2);
return node;
catch (Exception e)
failed = true;
Log.v("error",""+e);
@Override
protected void onCancelled()
failed = true;
if (reader != null)
try
reader.close();
catch (IOException e)
failed = true;
if (isr != null)
try
isr.close();
catch (IOException e)
我知道我可以将下载过程分解成更小的部分,但我正在下载非常小的文件,所以这并不重要。
【讨论】:
以上是关于安卓停止下载的主要内容,如果未能解决你的问题,请参考以下文章