Android прекратить загрузку - PullRequest
0 голосов
/ 06 февраля 2011

В моем приложении я загружаю и анализирую 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;
   }

Ответы [ 2 ]

1 голос
/ 24 марта 2011

Хорошо, я думаю, что я решил это.

В моем классе 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) {
        }
}

Я знаю, что мог бы разбить процесс загрузки на еще более мелкие биты, но я загружаю очень маленькие файлы, поэтому это не так важно.

1 голос
/ 06 февраля 2011

Не можете ли вы использовать AsyncTask.cancel()? Затем вы сможете использовать обратный вызов onCancelled, чтобы вернуться к основному виду деятельности.

...