В руководстве для разработчиков Android есть достойный раздел об использовании Fragments. Один из способов использования фрагментов - без пользовательского интерфейса. Есть несколько ссылок на использование этого как средство фоновой обработки, но какие преимущества делают Фрагменты в этой области? Где бы я решил использовать фрагмент над потоками, AsyncTasks, Handlers и т.д. Для фоновой обработки?
Каков прецедент для фрагмента без пользовательского интерфейса?
Ответ 1
ЭкземплярA Fragment
может сохраняться через изменения конфигурации устройства (например, поворот экрана). Поскольку Activity
будет уничтожен и воссоздан, когда произойдет сбой конфигурации, трудно создать тот, который будет отслеживать поток или AsyncTask
. С другой стороны, система заботится о повторном прикреплении сохраненного Fragment
к соответствующему Activity
на другом конце (так сказать) изменения конфигурации. Вы все равно будете использовать поток или AsyncTask
, только теперь Fragment
удерживает его.
Для него могут быть другие применения, но есть тот, о котором я могу думать.
Ответ 2
У меня есть большой кусок довольно сложного кода, который обрабатывает логины для различных социальных сетей - facebook, google, twitter. Это код, который мне нужно повторно использовать в разных действиях, так как пользователь может войти в систему из разных мест приложения. Он не относится к классу базовой активности, потому что вы можете наследовать только один класс, и я использую это наследование для других, не связанных между собой функциональных возможностей.
Фрагмент ui-less идеально подходит для моей ситуации, и фрагмент подходит для вас, так как мне нужны обратные вызовы жизненного цикла, например (facebook известен в этом отношении, нуждаясь, например, onActivityResult и т.д.).
Ответ 3
Я согласен с Грегом Эннисом.
Сейчас я работаю над приложением, которое должно выполнить серию вызовов RESTful api. По большей части это делается только в рамках одного действия. Но я просто использовал безгласный фрагмент, чтобы разобраться с случаем, когда для каждой последовательности нескольких вызовов требовалось два разных действия и, конечно же, обрабатывать ошибки в любом месте последовательности. Путем централизации последовательности в фрагменте я мог избежать дублирования достаточного количества кода.
У нас есть еще один вызов api, который возвращает много данных, которые все обрабатываются в потоке пользовательского интерфейса прямо сейчас и занимают слишком много времени. В будущей версии backend api серверная страница будет отображать данные, и наше приложение должно будет сделать серию вызовов api, чтобы получить полные результаты. Я думаю, что это будет отличное приложение для оставленного безголового фрагмента. Начальная активность может запускать безгласный фрагмент и последовательность вызовов. Если при первом вызове нет ошибки, эта активность может начать следующую операцию, чтобы отобразить начальные результаты, в то время как фрагмент просто продолжает прерываться и запрашивает сервер для следующей страницы данных. Вызовы api уже выполняются в фоновом потоке. Я уверен, что сохраненный фрагмент должен будет запускаться на рабочем потоке.
Там больше информации о сохраненных фрагментах в Понимание набора фрагментов FritmentRetainInstance (boolean)
Ответ 4
Они также называются Безглавых фрагментов. Вы можете прочитать больше здесь
Ответ 5
Очень полезная особенность безгласных фрагментов
Безглавые фрагменты, есть одна действительно полезная функция - они могут быть сохранены FragmentManager через изменения конфигурации. Поскольку у них нет какого-либо интерфейса, связанного с ними, их не нужно разрывать и перестраивать снова, когда пользователь поворачивает устройство, например. Чтобы активировать это поведение, нужно просто установить сохраненный флаг Фрагмента при его инициализации. Это можно сделать в методе onCreate для фрагмента.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}