Android 停止下载

标签: Android HTML
发布时间: 2017/3/14 23:55:00
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

在我 application 我下载并解析 html 页。然而,我想能够停止在其轨道下载 (即当用户点击取消)。

这是我现在使用的代码,从 doInBackground 从被人称为 ASyncTask

如何做取消此请求从外面的 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:

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

在我 Activity 我有一个变量 (布尔值) 的类 failed 。还有一个私人 Downloader 类内 activity 延伸 ASyncTask 。这种方式, Downloader 类有权访问 failed 布尔。当 Activity 发射,它开始 Downloader 任务和进步 dialog 弹出。当任务完成后时,它会关闭 dialog 然后就上处理下载的内容。

然而,当用户取消进度 dialogfailed 设置为 true,用户发送回以前 activity 通过调用 finished 。同时, Downloader 也仍然忙著下载。结果现在是不必要的因为我们想要它停止使用 resources 尽快。为了做到这一点,我吹了 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) {
        }
}

我知道,我可能会分手,下载 process 在更小的位,但我正在下载非常小的文件,所以它不是那么重要。

官方微信
官方QQ群
31647020