2013-07-19 2 views
1

У меня недавно возникла проблема, когда я вызвал асинтаску из действия и вернул некоторые данные. Мой пользовательский интерфейс замерзнет, ​​и я получаю ANR. Я, похоже, решил это, используя комбинацию решений для обеих вещей, которые, как я думал, это может быть, как асинтеза, так и аррайалист, который я выполнял.Лучший способ отменить asynctask

У меня был обратный вызов асинхронности для загрузки данных асинхронно. Я догадался, хотя мне нелегко было понять, что асинститут сохраняется после onpostexecute? В любом случае я назвал this.cancel() в onpostexecute.

После некоторого чтения немного, функция cancel() при расписании задачи отменяется и что она может сохраняться после запроса. Поэтому я должен спросить, есть ли лучший способ отменить асинтез после того, как вы закончите с ним? Будет ли в большинстве случаев отменено()? Есть ли способы избежать необходимости называть cancel() вообще при выполнении обратного вызова.

+0

Что вы делаете ('call this.cancel()' in' onPostExecute() ') является избыточным. Когда выполнение достигло 'onPostExecute()', поток ждет сборщика мусора. Если другой «AsyncTask» нуждается в потоке, этот поток может быть переработан. Но вы не должны беспокоиться об этом. Здесь возникает вопрос: почему ваш «AsyncTask» вводит пользовательский интерфейс? – Vikram

+0

@vikram есть приличный шанс, я был неправ, что это проблема асинтеза, и это мог быть мой ArrayList. Казалось, что планировать это. Отказ был лишним, но я не был уверен. Я не был уверен в том, как его можно сохранить и связать пользовательский интерфейс после вызова onpostexecute. Мой UI ANR не происходит до тех пор, пока не вызывается onpostexecute. – user2097211

+0

Вы можете написать еще один вопрос, чтобы получить помощь по проблеме ANR. – Vikram

ответ

0

То, что я делал в прошлом, задает синхронизированное логическое значение, которое может видеть задача async и его вызывающий. Когда я хочу отменить задачу async, я устанавливаю логическое значение false (обычно называемое активным). Внутри задачи async я проверяю флаг в разных точках, и если он когда-либо был ложным (то есть он был отменен), я просто возвращаюсь, не выполняя оставшуюся часть задачи.

Не видя вашей конкретной ситуации, трудно быть более конкретным.

Надеется, что это помогает, Майку

+0

реализуете ли вы синхронизированное логическое значение в обратном вызове, создаваемом для асинхронных задач?Это звучит неплохо, особенно условие возврата, не требующее отмены. – user2097211

+0

См. [Это сообщение] (http://stackoverflow.com/questions/17724048/asynctask-get-no-progress-bar/17725922?noredirect=1#comment25840553_17725922) Я только что привел пример этого вчера кому-то, пытающемуся искупить задача. Образец базового кода есть. – Rarw

+0

@Rarw спасибо, это отличный пример! – user2097211

0

Если вы поместите некоторые строки коды в doInBackground, что выполняется только один раз, а не в цикле, нет никакого способа, чтобы отменить его после выполнения вашего task.But, если у вас есть цикл в это или другие команды, которые запускаются периодически, вы можете использовать setCancel (true) для своей задачи и проверить значение задачи isCanceled() перед выполнением вашего оператора в цикле.

0

У меня была аналогичная проблема, как ты

проверки this, об отмене в AsyncTask

также читать this о функции обратного вызова. Может быть, если вы перепишете onPostExecute(), вы можете сделать что-то проще в своей жизни.

0

Использование логической переменной - это то, что вам нужно сделать, как уже было предложено. Но не реализуйте это самостоятельно, так как инфраструктура Android уже делает это за вас. Используйте AsyncTask.cancel() в своем абоненте, а в AsyncTask используйте isCancelled() в tet для запроса отмены.

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