2014-02-18 1 views
5

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

В настоящее время я звоню в веб-службу от onCreateView() Метод фрагмента. Проблема я получаю, что всякий раз, когда происходит вызов веб-службы, и если ориентация устройства изменяется, начинается новый вызов веб-службы.

Я думаю, что это может быть потому, что метод onCreateView() вызывается при изменении конфигурации.

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

+0

У меня такая же проблема. Когда я поворачиваю свою вкладку на 90 градусов, 'onCreate' вызывается снова и пытается повторно открыть уже открытый сокет, и поскольку сокет не был закрыт до поворота вкладки, возникает ошибка, и приложение прерывается. Ваш случай отличается от моего, хотя, потому что вы не получили никакой ошибки, только новое соединение запущено. – mangusta

+0

Я попытался найти какое-то конкретное событие, чтобы перехватить изменение ориентации и закрыть сокет до перезапуска активности, но не удался.Одно можно сказать наверняка, 'onCreate()' вызывается при изменении ориентации – mangusta

+0

PS. Хм, просто понял, что я могу проверить, открыт ли сокет или нет в самом начале 'onCreate()' и закрыть его, если он есть :) – mangusta

ответ

2

я решил это, следующий обходной

  1. Создать идентификатор операции для каждого метода вызова веб-службы. Например. например, «Аутентификация» для входа в систему вызова

  2. Создать один объект ArrayList сказать currentTasks

    ArrayList<String> currentTasks = new ArrayList<String>(); 
    
  3. В каждом методе, где я звоню веб-службы, проверьте, если операция идентификатор соответствующего метода уже присутствует в ArrayList , Если нет, тогда начните работу.

    String operationId = "Authentication"; 
    if(currentTasks.indexOf(operationId) == -1) 
    { 
        <do web service call operation here> 
        currentTasks.add(operationId); 
    } 
    
  4. Способ, в котором выше ответ операция является получение, удалить идентификатор операции из ArrayList

    if(currentTasks.indexOf("Authentication") != -1){ 
        currentTasks.remove("Authentication"); 
    } 
    

Это будет гарантировать, что вызов не будет идти на веб-метод, который в настоящее время находится в стадии разработки.

Я знаю, что это не лучший способ достичь этого, и это может не лучшая практика, но пока это работает для меня.

0

Если код веб-службы перезапускается из-за изменения ориентации устройства, то вы, вероятно, используете AsyncTask. Это обычная проблема с AsyncTasks, и у вас есть несколько способов ее решения.

Общим обходным путем является обертывание вашей AsyncTask вокруг невидимого Fragment и убедитесь, что этот фрагмент не разрушен и снова воссоздан во время изменения ориентации. Ознакомьтесь с этим руководством о том, как это сделать: Retaining Objects Across Config Changes

+0

можете ли вы предоставить код, который может объяснить это больше? – silwar

+0

Проверьте ссылку, которую я добавил выше. Если вы перейдете на этот сайт, просмотрите раздел «Рекомендуемые: Управление объектом внутри сохраненного фрагмента» для полного примера. – Henrique

0

Простым решением будет использование статической переменной, указывающей на асинтез. Создайте и вызовите AsyncTask, если переменная не равна null.

С уважением, Prateek

+0

Будьте осторожны с этим подходом. Удержание статической переменной во время изменений вращения очень подвержено утечке памяти. – Henrique

+0

@Henrique Можете ли вы объяснить это дело –

+0

Полное объяснение - это тема сама по себе и слишком длинная, чтобы ее можно было добавить в качестве комментария, но, как пример, предположим, что у вас есть статическая AsyncTask, которая содержит ссылку на нее владелец. Если действие уничтожается, потому что пользователь оставил его, но AsyncTask еще не завершен, активность все равно будет сохранена, так как есть живая ссылка на него. Таким образом, мы в основном сохраняем вещи вокруг, которые не должны быть там и должны быть очищены сборщиком мусора. Попробуйте найти утечки памяти Android для других особых случаев, подобных этому. – Henrique

Смежные вопросы