在我的应用程序中,我下载并解析一个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;
}
答案 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) {
}
}
我知道我可以在更小的位置打破下载过程,但我正在下载非常小的文件,所以它并不重要。