Я читал много о том, как сохранить мое состояние экземпляра или как иметь дело с моим действием, уничтожаемым во время экранного вращения.
Кажется, существует много возможностей, но я не выяснил, какой работает лучше всего на получение результатов AsyncTask.
У меня есть некоторые AsyncTasks, которые просто запускаются снова и звонят isFinishing()
метод действия и если действие заканчивает их привычка, обновляет что-либо.
Проблема состоит в том, что у меня есть одна Задача, которая делает запрос к веб-сервису, который может перестать работать или успешно выполниться, и перезапуск задачи привел бы к финансовым потерям для пользователя.
Как Вы решили бы это? Каковы преимущества или недостатки возможных решений?
Мое первое предложение - убедиться, что вам действительно нужно, чтобы ваша активность сбрасывалась при повороте экрана (поведение по умолчанию). Каждый раз, когда у меня возникали проблемы с поворотом, я добавлял этот атрибут в тег
в AndroidManifest.xml, и все было в порядке.
android:configChanges="keyboardHidden|orientation"
Выглядит это странно, но это передается вашему методу onConfigurationChanged()
, если вы его не предоставите, он просто ничего не делает, кроме повторного измерения макета, что кажется совершенно адекватным способом обработки поворота в большинстве случаев.
Это самый интересный вопрос, который я видел по Android!!! На самом деле я уже искал решение в течение последних месяцев. До сих пор не решил.
Будьте осторожны, простого переопределения
android:configChanges="keyboardHidden|orientation"
вещей недостаточно.
Рассмотрим случай, когда пользователь получает телефонный звонок во время выполнения вашей AsyncTask. Ваш запрос уже обрабатывается сервером, поэтому AsyncTask ожидает ответа. В этот момент ваше приложение переходит в фоновый режим, потому что приложение "Телефон" только что вышло на передний план. ОС может убить вашу активность, так как она находится в фоновом режиме.
Вы можете проверить, как я обрабатываю AsyncTask
и изменения ориентации на code.google.com/p/shelves. Существуют различные способы сделать это, один из них, который я выбрал в этом приложении, - это отменить любую запущенную в данный момент задачу, сохранить ее состояние и начать новую с сохраненным состоянием при создании нового Activity
. Это легко сделать, он работает хорошо, и в качестве бонуса он заботится о остановке ваших задач, когда пользователь покидает приложение.
Вы также можете использовать onRetainNonConfigurationInstance()
, чтобы передать ваш AsyncTask
новому Activity
(будьте осторожны, чтобы не утечка предыдущего Activity
таким образом.)