2013-03-03 2 views
0

Я работаю над приложением в режиме реального времени. Я написал часть, которая обрабатывает входящее сообщение. Когда я получаю сообщение, я вставлю записи в SQ-LITE и инициирую обратный вызов, чтобы заметить пользовательский интерфейс для обновления (ListView). В обратном вызове я реализую несколько вещей для обновления пользовательского интерфейса. Я использую адаптер курсора. В обратном вызове я запустил AsyncTask, в фоновом режиме, я запрошу базу данных, чтобы получить историю чата. В onPostExecute я буду использовать курсор этого запроса из фона и назначить адаптеру и обновить интерфейс.Android как остановить/отменить AsyncTask, когда запущено слишком много AsyncTask?

Так что мой вопрос: Если есть много входящих сообщений, это вызовет множество AsyncTask и обновит UI много раз. Так что он сделает ListView очень «лаг», и даже пользователь ничего не сможет сделать. Как я могу остановить/отменить AsyncTask и обработать только последнюю версию, так как я получу всю историю чатов в базе данных, это означает, что последний запрос к истории чата в базе данных должен быть правильным.
Может ли кто-нибудь предложить, как остановить AsyncTask или любые другие идеи для работы над этим делом?

+0

Похоже, вам нужна очередь 'AsyncTask', которая будет управлять их количеством ... но есть небольшая проблема с остановкой' AsyncTask'. См. Это сообщение для ссылки http://stackoverflow.com/questions/12971882/cancel-all-asynctask. –

ответ

2

Поместите свои AsyncTasks в список при их создании (или в методе onPreExecute()) и удалите их из списка по завершении (в методе onPostExecute()). Таким образом, ваш список будет содержать все текущие, а не завершенные AsyncTasks, поэтому, когда вам нужно остановить их все, просто перейдите в список и остановите каждую задачу, кроме последней добавленной.

+0

Ваша идея замечательная ... но как узнать, какой из них работает? – jjLin

+2

Вы можете проверить, работает ли задача легко, строка, приведенная ниже, является истиной, если задача запущена: 'if (task.getStatus() == AsyncTask.Status.RUNNING)' –

Смежные вопросы