WedX - журнал о программировании и компьютерных науках

Как мне остановить мою AsyncTask?

Моя асинхронная задача загружает файл в фоновом режиме, когда приложение открыто, после загрузки файла оно запускает действие. Который работает нормально. Проблема в том, что я хочу остановить загрузку и открытие моей асинхронной задачи, если я закрою приложение. Я пробовал это, он останавливает службу, но AsyncTask не останавливается.

class DownloadFileAsync extends AsyncTask<String, String, String> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... aurl) {
        int count;
        try {
            URL url = new URL(aurl[0]);
            URLConnection conexion = url.openConnection();
            conexion.connect();
            int lenghtOfFile = conexion.getContentLength();
            Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile);
            InputStream input = new BufferedInputStream(url.openStream());
            // OutputStream output = new
            // FileOutputStream("/sdcard/.temp");//.temp is the image file
            // name

            OutputStream output = new FileOutputStream(VersionFile);
            byte data[] = new byte[1024];
            long total = 0;
            while ((count = input.read(data)) != -1) {
                total += count;
                publishProgress("" + (int) ((total * 100) / lenghtOfFile));
                output.write(data, 0, count);
            }
            output.flush();
            output.close();
            input.close();
        } catch (Exception e) {
        }
        return null;
    }

    protected void onProgressUpdate(String... progress) {
        Log.d("ANDRO_ASYNC", progress[0]);
    }

    @Override
    protected void onPostExecute(String unused) {
        //start activity
        Intent dialogIntent = new Intent(context,
                NSOMUHBroadcastDisplay.class);
        dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(dialogIntent);
        // now stop the service
        context.stopService(new Intent(context,
                NSOMUHBroadcastService.class));
    }
}

@Override
public void onDestroy() {
    Log.v("SERVICE", "Service killed");
    stopService(new Intent(this, NSOMUHBroadcastService.class));
    super.onDestroy();
}

Ответы:


1

Прежде всего вам нужна ссылка на ваш экземпляр AsyncTask. скажем

DownloadFileAsync mTask;

Вам нужно позвонить:

mTask.cancel(true);

Этого еще недостаточно. Внутри вашего метода doInBackground() вы должны проверить, был ли отменен AsyncTask.

if(isCancelled) {
    // exit
}

В вашем случае, вероятно, вы можете использовать эту проверку внутри своего while, чтобы в случае отмены задачи вы закрывали поток и заканчивали.

ПРИМЕЧАНИЕ: если вы не хотите останавливать работу в doInBackground(), достаточно вызвать mTask.cancel(true), потому что метод isCancelled() автоматически вызывается в onPostExecute().

03.03.2017
  • Первая — это глобальная переменная. Когда вам нужно запустить AsyncTask, сделайте mTask = new DownloadFileAsync(); и запустите его mTask.execute(your_input); Затем, когда вы захотите остановить свою AsyncTask, просто вызовите mTask.cancel(true). isCancelled() используется внутри doInBackground примера 03.03.2017
  • я не понимаю) не могли бы вы опубликовать фрагмент, ? 03.03.2017

  • 2

    используйте yourtask.cancel() в onDestroy().

    Используйте эту ссылку для получения дополнительных разъяснений: Android — принудительно отменить AsyncTask

    03.03.2017
    Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]