Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓停止下载_Android_Html_Download_Abort - Fatal编程技术网

Android 安卓停止下载

Android 安卓停止下载,android,html,download,abort,Android,Html,Download,Abort,在我的应用程序中,我下载并解析一个html页面。但是,我希望能够在其轨道上停止下载(即,当用户点击“取消”时) 这是我现在使用的代码,它是从ASyncTask的doInBackground调用的 如何从异步任务外部取消此请求 我目前使用 不能使用AsyncTask.cancel()?然后,您应该能够使用onCancelled回调返回到主活动。好的,我相信我已经解决了这个问题 在我的活动类中,我有一个变量(布尔值)failed。另外,我在扩展ASyncTask的活动中有一个私有的下载程序类。这样,

在我的应用程序中,我下载并解析一个html页面。但是,我希望能够在其轨道上停止下载(即,当用户点击“取消”时)

这是我现在使用的代码,它是从ASyncTask的doInBackground调用的

如何从异步任务外部取消此请求

我目前使用


不能使用
AsyncTask.cancel()
?然后,您应该能够使用
onCancelled
回调返回到主活动。

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

在我的活动类中,我有一个变量(布尔值)
failed
。另外,我在扩展
ASyncTask
的活动中有一个私有的
下载程序
类。这样,
Downloader
类就可以访问
failed
布尔值。当活动启动时,它启动
下载程序
任务,并弹出进度对话框。任务完成后,它关闭对话框,然后继续处理下载的内容

但是,当用户取消进度对话框时,
failed
设置为true,并通过调用
finished
将用户发送回上一个活动。与此同时,
Downloader
仍在忙于下载。因为结果现在是不必要的,我们希望它尽快停止使用资源。为了实现这一点,我将
doInBackground
方法分解为尽可能多的步骤。在每一步之后,我检查
失败
是否仍然是
错误
,当它设置为
时,它不会进入下一步。请参见下面的操作。此外,
BufferedReader读取器
是公共的,在
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) {
        }
}

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

这也会自动停止下载吗?我使用URLConnection类进行下载。不,事实证明它不会(关于这个问题的文档是错误的-调用
AsyncTask。取消(true)
不会停止任务的实际运行。你能发布代码来实际下载吗?我已将其添加到问题中。谢谢你的麻烦!
 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) {
        }
}