Android Volley – изменения ориентации

Как мы можем иметь дело с изменениями ориентации, Activities / Fragments останавливающиеся / возобновляющиеся с помощью Volley ?

Я знаю, что для запросов GET ответ будет кэшироваться, и во второй раз, когда мы попытаемся сделать этот запрос, мы получим кешированный ответ (если сервер отправляет соответствующие HTTP-заголовки)

Но как насчет POST ? Предположим, что я делаю POST запросы (т. Е. Регистр, который я хочу выполнить только один раз), мое приложение переходит в фоновый режим, запрос завершается, пока приложение все еще находится в фоновом режиме, а затем я возвращаюсь в приложение. Как я могу получить Response для этого Request или как его повторно подключить к нему, если он все еще ожидает?

AFAIK почти не поддерживает это в Volley . Я прав? Есть ли простой способ решить вышеупомянутый сценарий, используя Volley ?

Solutions Collecting From Web of "Android Volley – изменения ориентации"

Volley не предоставляет механизм для этого из коробки, но вы можете посмотреть в библиотеку Otto Square для Android, она предназначена для того, чтобы обрабатывать такие ситуации, как ваши элегантно.

Внедрите Listener для запроса Volley, чтобы он отправил успешный ответ на шину, завернутый в объект события, например «RegisterEventSuccess» (вы сами определяете это). Пусть ваши действия или фрагменты подписываются на этот тип события с помощью механизма @Subscribe Отто. Если – например, – одно действие запускает запрос Volley и умирает из-за изменения ориентации экрана, другой экземпляр Activity (также зарегистрированный на шине Otto) может затем принять событие, которое содержит ответ запроса Volley.

Надеюсь, это было полезно.

Теперь я попытался решить проблему @ kyle-ivey в том, что ответы, поступающие между onPause() и onResume() , отбрасываются. Это реальная проблема, поскольку я испытал ее в реальном приложении.

Мой подход основывается на шаблоне шины событий, реализованном в ответ Томасом Моерманом, хотя я повторил пример приложения с нуля. Это зависит от библиотеки автобусов Otto Event , Gson и Volley . Он реализован в IntelliJ 13 Ultimate, используя Maven tom для решения зависимостей.

Решение. Я добавляю к предыдущим ответам класс, который действует как буфер ответа HTTP, который берет на себя ответственность за прослушивание событий во время перехода активности. Когда это будет сделано, активность будет активно опроса для любых ответов, которые могли быть получены, когда активность была отключена от шины событий. Он перехватывает onPause / выкл в onPause и onResume -events рядом с регистрацией события-шины следующим образом:

 @Override protected void onPause() { super.onPause(); ServiceLocator.ResponseBuffer.startSaving(); // The buffer takes over ServiceLocator.EventBus.unregister(this); // Unregistering with Otto } @Override protected void onResume() { ServiceLocator.EventBus.register(this); // Re-registering ServiceLocator.ResponseBuffer.stopAndProcess(); // Process any responses buffered } 

Вот реализация класса ResponseBuffer .

Предостережение 1 : если действие никогда не возобновляется, и ни stopAndProcess() ни stopAndPurge() вызывается в любой будущей деятельности, буфер может быть источником утечки памяти. Помните, как вы его используете. Безопасным шаблоном было бы иметь stopAndProcess() в onResume() во всех ваших действиях.

Предостережение 2 : Оно не является потокобезопасным. Если на линии между тем, где она хранится, будет переключаться контекст, и он отменяет регистрацию шины события, он может получить событие дважды или нулевое время.

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

  • nilzor.ottovolley.core
  • nilzor.ottovolley.messages

См. Github-хранилище OttoVolleyDoneRight для полного примера с пользовательским интерфейсом для тестирования.

Существует простое решение, которое решило мою проблему с загрузкой данных из сети с использованием библиотеки Volley. Если ваше приложение использует фрагменты из-за рекомендаций Google, чем все, что вы должны сделать, чтобы предотвратить сбой, если пользователь поворачивает экран во время загрузки данных, ставится setRetainInstance(true); onCreateView методе onCreateView вашего фрагмента (-s).

 @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View theView = inflater.inflate(R.layout.fragment_studios, container, false); setRetainInstance(true); lvStudios = (ListView) theView.findViewById(R.id.lvStudios); return theView; }