Android停止下载

时间:2011-02-06 16:14:51

标签: android html download abort

在我的应用程序中,我下载并解析一个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;
   }

2 个答案:

答案 0 :(得分:1)

你不能使用AsyncTask.cancel()吗?您应该能够使用onCancelled回调来返回主活动..

答案 1 :(得分:1)

好的,我相信我已经解决了这个问题。

在我的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) {
        }
}

我知道我可以在更小的位置打破下载过程,但我正在下载非常小的文件,所以它并不重要。