【发布时间】:2019-06-12 17:36:43
【问题描述】:
我的应用程序有几个由不同片段用户启动的长进程,我想在它们完成时显示一个进度对话框。我希望这个进度对话框显示在几个片段中,以便仍然启用底部导航,这样用户仍然有一种代理感,但他们不能采取任何实际有害的行动。我的大部分“主要”片段都以这种方式被屏蔽,但其他如设置和帮助片段则不需要。
我目前的解决方案不太理想。动作是在片段中由用户启动的,但活动负责实际完成它们,因此它可以在需要的每个片段上覆盖一个进度对话框。我宁愿让片段负责自己的任务。 明显的关注点分离变得非常重要,因为活动 VM 的大小已经变得庞大,并且太多的业务逻辑在该类中(然后适当地委托给模型)。
例如
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
}
}
我想到的另一个解决方案是将视图状态推送到模型层。似乎这需要一个单例(和一堆并发保护工作),以便视图模型无法开始覆盖状态,因为它正在完成这些长期运行的任务之一。目前这是自动避免的,因为只有一个活动虚拟机处理所有工作。
那么,有没有可能在不依赖模型层中的单例的情况下实现这种关注点分离?
【问题讨论】:
标签: android android-fragments design-patterns mvvm architecture