Как правильно использовать фрагменты?

384
06 февраля 2018, 08:58

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

Answer 1

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

Рассмотрим сначала ситуацию, когда у вас есть только Activity и Fragment'ы в ней, без вспомогательных классов, что за классы опишу позднее.

Каждый фрагмент может находиться внутри Активити, и так же мы можем каждый фрагмент использовать в разных активити. Например, у нас есть фрагмент, который в себе содержит DatePicker для выбора времени. И этот фрагмент мы можем использовать, допустим в активити А и активити Б. Чтобы мы могли безболезненно переиспользовать фрагмент, нам необходимо, чтобы он не зависел от активити которая его вызывает. Т.е. весь код отвечающий за работу этого фрагмента должен находиться внутри него.

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

Какой вывод можно сделать? Тут действует принцип разделения ответственности. Вы должны четко определить какой класс чем занимается. В описанных мной случаях Активити является связующим звеном, а конкретные задачи выполняются в фрагментах. Идеальная ситуация - когда ваши фрагменты ничего не знают об активити

Теперь о вспомогательных классах -

а в фрагмент лишь передавать данные для отображения?

Это хорошая мысль, но чтобы её реализовать, вам необходимо взглянуть в сторону паттернов MVP (Model View Presenter) \ MVVM (Model View ViewModel). Эти паттерны как раз и отвечают на ваш вопрос. В них есть отдельные классы (Presenter & ViewModel), которые занимаются исключительно логикой , обращениями в базу и тд. А фрагменты выступают в роли View и отвечают только за отображение данных

READ ALSO
ArrayList<String>() у Вас тоже 6 == 10?

ArrayList<String>() у Вас тоже 6 == 10?

Добавляю элементы в список посредством нехитрого кода на JDK 9:

173
Исключение поля из Response.jsonPath()

Исключение поля из Response.jsonPath()

В ответе приходит массив обьектовЯ делаю следующее:

225
Перестал запускаться сайт с Tomcat после подключения Hibernate

Перестал запускаться сайт с Tomcat после подключения Hibernate

Разбираюсь с Hibernate и Tomcat, сделала пробную страницу сайта, навесила несколько сервлетов, запуск с Tomcat прошел норм, на запросы сервлеты реагировалиПотом...

202