Мое приложение имеет несколько длительных процессов, которые инициируются пользователем различными фрагментами, и я хотел бы отобразить диалог прогресса, пока они завершаются.Мне бы хотелось, чтобы это диалоговое окно прогресса отображалось между несколькими фрагментами, чтобы нижняя навигация все еще была включена, чтобы у пользователя все еще было чувство готовности, но в противном случае он не может предпринять никаких действительно вредных действий.Большинство моих «основных» фрагментов блокируются таким образом, но другие, такие как настройки и фрагменты справки, не обязательно должны быть.
Мое текущее решение не идеально.Действия инициируются пользователем во фрагменте, но действие становится ответственным за их фактическое выполнение, так что оно может перекрывать диалог прогресса над каждым необходимым фрагментом.Я бы предпочел, чтобы фрагменты отвечали за их собственные задачи.Очевидное разделение интересов становится довольно важным, поскольку размер виртуальной машины деятельности стал огромным, и слишком большая часть бизнес-логики находится в этом классе (и затем соответствующим образом делегируется модели).
например
class MyFragment : Fragment() {
// MyActivity will implement this interface
interface NetworkProcess {
fun start()
}
// start() is called on a button click or something similar
}
class MyActivity : AppCompatActivity(), MyFragment.NetworkProcess {
override fun onCreate(savedInstanceBundle: Bundle?) {
// Observe state from VM layer
// Observer updates progress dialog
}
override fun start() {
// Pass action to VM layer
}
}
Одно из решений, которое я попробовал, состоит в том, чтобы использовать интерфейс только для отображения состояния, но затем, если фрагмент удален от него, он не может вызвать интерфейс и продолжить обновление диалога.
например,
class MyFragment : Fragment() {
// MyActivity will implement this interface
interface NetworkProcessDialog {
fun update(text: Int)
fun stop()
}
override fun onActivityCreated() {
// Observe state from viewmodel
// Set listener on a button send action to viewmodel to start process
}
}
class MyActivity : AppCompatActivity(), MyFragment.NetworkProcessDialog {
override fun updateDialog(text: Int) {
// Make dialog visible if not and show update
}
override fun stopDialog() {
// Make dialog invisible
}
}
Другое решение, о котором я подумал, - это вставить состояние просмотра в слой модели.Кажется, однако, что для этого потребуется одноэлементная (и куча параллельная защита), чтобы модели представления не могли начать перезаписывать состояние, так как оно находится в процессе выполнения одной из этих длительных задач.В настоящее время этого избегают автоматически, поскольку только одна виртуальная машина действия обрабатывает всю работу.
Итак, возможно ли разделить задачи такого рода, не полагаясь на синглтоны на уровне модели?