安卓停止下载

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) 
        

我知道我可以将下载过程分解成更小的部分,但我正在下载非常小的文件,所以这并不重要。

【讨论】:

以上是关于安卓停止下载的主要内容,如果未能解决你的问题,请参考以下文章

安卓相机 2 API

易联安卓系统能用么,求教

安卓怎么禁止软件联网?

安卓手机软件闪退怎么办 安卓软件停止运行解决方法

如何安装MySQL 5.0?

安卓电视盒子由于某种原因停止了应用程序