4

Я разрабатываю приложение для Android-планшета, и мне нужно реализовать ориентацию экрана (пейзаж и портрет). когда ориентация экрана изменяет повторную перезагрузку асинтактас фрагмента. (иногда сбой приложения) Мне нужно остановить перезапуск асинтезы и запросить данные снова. хотите загрузить существующие данные json на новый экран. любая помощь оценка.избежать перезапуска фрагментации асинтассы при изменении ориентации экрана

Соответствие: android:configChanges="keyboardHidden|orientation|screenSize" не работает из-за использования класса фрагмента.

+0

Ориентация изменения экрана вызывает onCreate(). Если вы хотите избежать перезапуска asyncTask, поставьте его на onResume или попытайтесь избежать onCreate при изменении ориентации. –

+0

Или сохраните состояние задачи async, а затем, при перезапуске, продолжите работу с той точки, в которой вы ее оставили – Massimo

ответ

1

Вы можете найти какой-либо взломать (в том числе заглушить изменения конфигурации или сохранить экземпляр), чтобы как-то заставить его работать, но действительно AsyncTasks are evil, и вы должны оставаться как можно дальше от него.

Если ваше текущее задание AsyncTask должно загрузить некоторые данные из сети, прежде чем показывать их внутри вашего Fragment, я бы рекомендовал использовать AsyncTaskLoader. Примеры в javadoc должны дать вам хорошее представление о том, как его реализовать.

Это позволит сетевому запросу продолжать движение во время поворота, чтобы уведомить пользовательский интерфейс (то есть LoaderManager.LoaderCallbacks) с результатом только тогда, когда он готов к его обработке (например, при вращении, например), а также будет кэшировать результат, чтобы вы не повторно запрашивали сетевой запрос каждый раз, когда вам нужны данные.

Есть куча сторонних библиотек, пытающихся решить эту очень распространенную проблему, и Loader также имеют свои тонкости, но если я правильно понимаю ваш пример использования, это должно быть именно то, что вам нужно.

Не забывайте, что любое решение, которое вы выберете, должно будет учитывать ротацию (действие уничтожить/воссоздать), которое происходит до, во время и после загрузки данных.

1

Кажется, что этот подход менее рекомендуется. Если вы инициализируете и выполняете свой AsyncTask в своем методе onCreate(), я бы предложил использовать подход this. В основном это заключается в сохранении данных, которые вам не нужно перезапускать при изменении конфигурации во время выполнения, поэтому вы можете обработать их впоследствии в методе onCreate() и решить, какую информацию вы хотите сохранить в предыдущем ландшафте и которую необходимо перезапустить.

1

Вы можете легко избежать «воссоздания» фрагмента, используя только метод setRetainInstance.

общественного недействительный setRetainInstance (булевы сохранить)

управление сохраняются ли экземпляр фрагмента через операцию повторное создание (например, от изменения конфигурации). Это может быть только , используемое с фрагментами, не находящимися в задней части. Если задано, жизненный цикл фрагмента будет немного отличаться при воссоздании активности:
• onDestroy() не будет вызываться (но onDetach() все равно будет, потому что фрагмент отсоединяется от его текущей активности).
• onCreate (Bundle) не будет вызываться, так как фрагмент не является воссоздан.
• onAttach (Activity) и onActivityCreated (Bundle) будет вызываться .

Reference link

Вы можете использовать это, например, в вас onCreateView метод, как это:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    setRetainInstance(true); 
    // ... more of your code 
} 

Хотя активность, которая содержит фрагмент еще Воссоздание экземпляр фрагмента будет то же самое, и они будут привязаны к новой деятельности.

Имейте в виду, что даже при setRetainInstance метода onCreateView будет вызываться всегда (в изменении ориентации), так как фрагмент нужно раздувать вид в соответствии с новыми космическими/размерами, так что если вы выполняете свой AsyncTask от метод, вы должны рассмотреть возможность переноса его на метод onCreate (который будет выполняться только один раз), чтобы избежать «повторного запуска» каждого изменения ориентации.

Надеюсь, это поможет.

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