#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, если вы каким-либо образом не блокируете поток пользовательского интерфейса.