Онлайн транзакция: asynctask vs service

1

В случае использования, когда пользователь должен выполнить онлайн-транзакцию, например, онлайн-платеж, используя приложение.

Это должно быть сделано без блокировки пользовательского интерфейса, поэтому я собирался использовать AsyncTask. Проблема заключается в следующем сценарии: - пользователь поворачивает телефон или получает входящий звонок в середине транзакции, тем самым вызывая действие.

Если я правильно понял, в asynctask теперь есть ссылка на устаревший объект. Поэтому после завершения транзакции невозможно сообщить пользователю о результатах. Это?

Должна ли использоваться услуга?

  • 0
    простой поиск в Google покажет вам так много результатов, первые три из которых получены от самого SO: google.com/…
  • 0
    @VirenShakya Я уже читал эти посты, но ни один из них не очистил мой разум. Например, принятый ответ для stackoverflow.com/questions/2620917/… не принят даже всеми комментаторами. Я все еще не уверен в решении.
Теги:
android-asynctask
android-service

1 ответ

2
Лучший ответ

Что такое услуга?

Большая путаница в отношении класса Service фактически вращается вокруг того, что это не так:

  • Служба не является отдельным процессом. Сам объект службы не подразумевает, что он работает в своем собственном процессе; если не указано иное, он работает в том же процессе, что и приложение, в котором оно входит.
  • Служба не является нитью. Это не значит, что нужно выполнять работу основного потока (чтобы избежать ошибок, связанных с ошибками приложения).

Должны ли вы использовать сервис или поток?

Служба - это просто компонент, который может работать в фоновом режиме, даже если пользователь не взаимодействует с вашим приложением. Таким образом, вы должны создать услугу, только если это то, что вам нужно.

Если вам необходимо выполнить работу вне основного потока, но только в то время, когда пользователь взаимодействует с вашим приложением, вам, вероятно, следует вместо этого создать новый поток, а не службу. Например, если вы хотите воспроизвести какую-либо музыку, но только во время работы, вы можете создать поток в onCreate(), запустить его в onStart(), а затем остановить его в onStop(). Также рассмотрите использование AsyncTask или HandlerThread вместо традиционного класса Thread. Дополнительную информацию о потоках см. В документе Процессы и Threading.

Помните, что если вы используете службу, она по-прежнему работает в основном потоке приложения по умолчанию, поэтому вы должны создать новый поток в службе, если он выполняет интенсивные или блокирующие операции.

Что приводит к тому, что деятельность может быть уничтожена, когда пользователь поворачивает телефон?

Если конфигурация устройства (как определено классом Resource.Configuration) изменится, то все, что отображает пользовательский интерфейс, необходимо будет обновить в соответствии с этой конфигурацией. Поскольку Activity является основным механизмом взаимодействия с пользователем, он включает специальную поддержку для обработки изменений конфигурации.

Если вы не укажете иное, изменение конфигурации (например, изменение ориентации экрана, языка, устройств ввода и т.д.) Приведет к уничтожению вашей текущей активности, выполнению процесса жизненного цикла обычной активности onPause(), onStop() и onDestroy() в зависимости от ситуации. Если действие было на переднем плане или видимо для пользователя, как только onDestroy() вызывается в этом экземпляре, тогда будет создан новый экземпляр действия с любым сохраненнымInstanceState предыдущего экземпляра, сгенерированным из onSaveInstanceState (Bundle).

Возможное обходное решение для решения AsyncTask прерывания из-за активности отдыха:

В некоторых особых случаях вы можете обойти перезапуск своей активности на основе одного или нескольких типов изменений конфигурации. Это делается с помощью атрибута android: configChanges в его манифесте. Для любых изменений конфигурации вы говорите, что вы там работаете, вы получите вызов вашей текущей активности onConfigurationChanged (Configuration) вместо перезапуска. Однако если изменение конфигурации связано с тем, что вы не обрабатываете, активность все равно будет перезапущена, а onConfigurationChanged (Configuration) не будет вызываться.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню