AsyncTask не останавливается - PullRequest
0 голосов
/ 12 августа 2011

Я создал AsyncTask, который загружает историю сообщений из базы данных, а затем показывает ее на экране устройства:

private void loadHistoryFromDB(Date lastUpdateDate)
    {
    final class DBAsyncTask extends AsyncTask<Void, Void, List<XMPPMessage>>
    {
        @Override
        protected List<XMPPMessage> doInBackground(Void... arg0) 
        {
            List<XMPPMessage> messages = null;
            try 
            {
                messages = PersistenceManager.getXMPPMessagesFromDB(userInfo, 0, messagingActivity);
            }
            catch (SQLException e) 
            {
                e.printStackTrace();
            } 
            catch (LetsDatabaseException e)
            {
                e.printStackTrace();
            }
            return messages;
        }

Кажется, он работает нормально, но после выполнения оставляет 2 запущенных потока, и я не могу завершить действие из-за этого. Как я могу это исправить?

Ответы [ 3 ]

2 голосов
/ 12 августа 2011

Пока ваши задачи выполняются правильно (выход из onPostExecute), вам не о чем беспокоиться. После выполнения AsyncTask поток (-ы) останется без возможности повторного использования в виде пула потоков или одного потока, в зависимости от версии платформы. Это нормальное поведение - они в конечном итоге будут очищены / использованы повторно.

0 голосов
/ 25 декабря 2013

Скорее всего, эта проблема связана с путаницей, связанной с методом отмены AsyncTask.

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

Я разместил подробное руководство по этой проблеме с примерами кода здесь:

http://tpbapp.com/android-development/android-asynctask-stop-running-cancel-method/

0 голосов
/ 12 августа 2011

Прежде всего, убедитесь, что вы вызываете super.doInBackGround() в верхней части переопределенного вызова метода.

Если это не так, скорее всего, вы поддерживаете соединение с базой данных.

То есть у вас все еще установлена ​​блокировка для базы данных.

Посмотрите, можете ли вы явно разблокировать базу данных, которая может решить вашу проблему.

Вы можете поместить его в метод onPostExecute().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...