Одна Activity и множество Fragment, best practices?

Здравствуйте! Посоветуйте пожалуйста хорошее решение для построения правильной архитектуры приложения с использованием одной activity и множества фрагментов. Сейчас у меня есть приложение с 20 экранами. Каждый экран реализован с помощью фрагмента. Все фрагменты находятся в одной активити. К сожалению, код в этой activity стало трудно поддерживать, т.к. количество строк уже превышает 4000. В основном код отвечает за работу с фрагментами, UI, работу с простыми данными. Я прекрасно понимаю что такого быть не должно, но пока не представляю как это можно все декомпозировать.

Подскажите best practices в решении данного вопроса.
  • Вопрос задан
  • 2087 просмотров
Пригласить эксперта
Ответы на вопрос 4
@alaershov
Android-developer
Я бы на вашем месте отказался от архитектуры "Одно Activity на всё приложение", и сделал всё на обычных Activity.
Проблема у вас, судя по всему, в разбиении функций приложения на слабо связанные модули. Разрисуйте и распишите ваши экраны и функции, которые принадлежат каждому из них, и подумайте, какие из функций зависят друг от друга, а какие нет.
Почитайте про принципы SOLID, которые помогут понять, как лучше разделять ответственность классов между друг другом: https://realm.io/news/donn-felker-solid-part-1/
Отделите бизнес-логику от UI-логики и логики хранения данных с помощью архитектуры Clean: fernandocejas.com/2014/09/03/architecting-android-...
Организуйте связь UI и бизнес-логики с помощью подхода MVP, где Model - это UseCases (они же Interactors) из Clean: antonioleiva.com/mvp-android
Попробуйте Moxy (https://github.com/Arello-Mobile/Moxy) в качестве библиотеки для реализации MVP, она избавит вас от написания большого количества boilerplate-кода и части проблем с переворотом экрана.
Ответ написан
Комментировать
@z0rgoyok
Странно, у меня в активити практически ничего кроме метода pushFragment(BaseFragment fragment).
Все фрагменты наследуются от BaseFragment, в котором есть метод getMainActivity.

И можно делать так из любого фрагмента getMainActivity().pushFragment(SomeFragment.newInstance())

Подход в целом как в iOS (почитайте про uinavigationcontroller)
Ответ написан
Комментировать
@hasdfa
Junior
Для каждого фрагмента создать свой клас.
И можешь использовать строение архитектуры - MVC (Model-View-Controller)
https://ru.m.wikipedia.org/wiki/Model-View-Controller
Ответ написан
mitaichik
@mitaichik
Ого!! 4000 строк - тут явно что то не то. Вам срочно нужно разбивать. Логика UI должна быть во фрагментах, классах вьюх, адаптерах и пр.. В хостовой активити у вас должна быть логика смены фрагментов (хотя тут можно тоже выделить отдельные классы). Бизнес логику выделяйте в отдельный слой. 4000 строк - это ужас!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы