Хорошо, я думаю, что я решил это.
В моем классе Activity у меня есть переменная (логическое значение) failed
.Кроме того, у меня есть частный Downloader
класс в рамках действия, который распространяется на ASyncTask
.Таким образом, класс Downloader
имеет доступ к логическому значению failed
.Когда запускается действие, запускается задача 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) {
}
}
Я знаю, что мог бы разбить процесс загрузки на еще более мелкие биты, но я загружаю очень маленькие файлы, поэтому это не так важно.