在我的Android应用中,我希望用户能够看到任务在后台运行的时间。
这些任务可以是网络调用,也可以是数据库操作,它们在单独的后台线程上运行。
ProgressBar
中只有一个不确定的Activity
,我想显示是否正在运行任何后台任务,否则将其隐藏。
我一直在寻找解决方案,人们似乎出于类似目的使用LiveData
。
因此,我想在LiveData
的{{1}}中创建一个ViewModel
,代表应用程序的当前加载状态,如下所示:
Activity
无论何时我开始或完成一项任务,我都会在此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
,所以什么也没发生)(正确) A 任务完成并将状态设置为LOADING
,但是 B 仍在运行(错误)
即使 B 仍在进行中,IDLE
也将被隐藏
ProgressBar
(错误)我以为我可以维护IDLE
个对象中的一个Collection
(就像在每个任务中单独使用一个LiveData
一样),但这似乎很麻烦。
是否有惯用的方式来处理此问题?
(也欢迎Java回答)
答案 0 :(得分:0)
我有一个简单的主意
在视图模型中使用类似的变量
var numberOFThreads = 0
并替换此行
loadingState.postValue(Status.LOADING)
使用
if(numberOFThreads == 0){
loadingState.postValue(Status.LOADING)
}else{
numberOFThreads++
}
and
if(numberOFThreads == 0){
loadingState.postValue(Status.IDLE )
}else{
numberOFThreads--
}