Android Как предотвратить сбой моей асинхронной задачи

#android #android-asynctask

#Android #android-asynctask

Вопрос:

Привет, итак, я новичок в Android и попытался реализовать класс, содержащий много строк кода, создав класс-оболочку, который превращает его в новый поток. В рамках этого действия вызывается множество других классов, и хотя мой поток пользовательского интерфейса загружается нормально, я думаю, что у моего потока вычислений истекло время ожидания или произошла какая-то другая форма сбоя, потому что когда я запускаю его, я получаю диалоговое окно ANR. Чтобы увидеть, насколько сильно это не удается, я ввел println в один из моих внутренних классов, и, похоже, он очень рано выходит из строя. Существует ли ограничение по времени для асинхронных задач? или, может быть, я делаю что-то не так, что приводит к сбою? любой совет очень ценится.

Ответ №1:

Нет, ограничений по времени нет. Но вам следует внимательно следить за тем, какие методы вы используете при выполнении какой-либо длительной работы. У AsyncTask есть метод doInBackground , который вызывается из рабочего потока, а другие вызовы выполняются из потока пользовательского интерфейса. Если вы получаете ANR, это означает, что вы выполняете свою работу в потоке пользовательского интерфейса, что неверно. Вместо этого вы должны сделать это в doInBackground методе.

Ознакомьтесь с документацией по AsyncTask и статьей о безболезненной обработке потоков.

Ответ №2:

Коди, если бы мне пришлось выполнять отладку, я бы обернул весь doInBackground в исключение try catch e и выполнил Log.d(ТЕГ «doInBackground», e). Малкольм прав в том, что это не должно приводить к сообщению ANR, если вы каким-либо образом не блокируете поток пользовательского интерфейса.