【发布时间】:2018-10-02 10:50:50
【问题描述】:
在我的 Android 应用中,我希望用户能够看到任务何时在后台运行。
这些任务可以是网络调用或数据库操作,在不同的后台线程上运行。
Activity 中有一个不确定的ProgressBar,我想显示是否有任何后台任务正在运行,否则将其隐藏。
我已经搜索过解决方案,人们似乎将LiveData 用于类似目的。
所以我想我会在Activity 的ViewModel 中创建一个LiveData,它代表应用程序的当前加载状态,如下所示:
val loadingState = MutableLiveData<State>()
每当我开始或完成一项任务时,我都会将适当的值发布到这个LiveData:
// starting background operation
loadingState.postValue(Status.LOADING)
我会从Activity 观察它,并根据当前状态显示/隐藏ProgressBar:
loadingState.observe(this, Observer { status ->
when (status) {
Status.LOADING -> showProgressBar()
Status.IDLE -> hideProgressBar()
}
}
我的问题是当多个任务在多个线程上运行时,我不知道如何处理。
例如:
-
一个任务启动并将状态设置为
LOADING(正确) -
B任务开始(状态已经是
LOADING所以什么都没有发生)(正确) -
A 任务完成并将状态设置为
IDLE,但 B 仍在运行(错误)ProgressBar将被隐藏,即使 B 仍在进行中 -
B任务完成,但状态已经是
IDLE(错误)
我以为我可以维护 LiveData 对象中的 Collection (就像每个任务在单独的 LiveData 中一样),但这似乎真的很麻烦。
有没有一种惯用的方法来处理这个问题?
(也欢迎 Java 回答)
【问题讨论】:
-
想到的第一个想法是将所有任务创建集中在需要一个任务管理器,该任务管理器可以保持任务的计数甚至实例,并在任务启动时提供用于查询和回调的 API/完成。