处理活动中多个线程的加载状态

时间:2018-10-02 10:50:50

标签: java android kotlin

在我的Android应用中,我希望用户能够看到任务在后台运行的时间。

这些任务可以是网络调用,也可以是数据库操作,它们在单独的后台线程上运行。

ProgressBar中只有一个不确定的Activity,我想显示是否正在运行任何后台任务,否则将其隐藏。

我一直在寻找解决方案,人们似乎出于类似目的使用LiveData

因此,我想在LiveData的{​​{1}}中创建一个ViewModel,代表应用程序的当前加载状态,如下所示:

Activity

无论何时我开始或完成一项任务,我都会在此val loadingState = MutableLiveData<State>() 上张贴适当的值:

LiveData

我会从// starting background operation loadingState.postValue(Status.LOADING) 观察它,并根据当前状态显示/隐藏Activity

ProgressBar

我的问题是,当多个线程上运行多个任务时,我不知道如何处理。

例如:

  • A 任务启动,并将状态设置为loadingState.observe(this, Observer { status -> when (status) { Status.LOADING -> showProgressBar() Status.IDLE -> hideProgressBar() } } (正确)
  • B 任务开始(状态已经为LOADING,所以什么也没发生)(正确)
  • A 任务完成并将状态设置为LOADING,但是 B 仍在运行(错误)

    即使 B 仍在进行中,IDLE也将被隐藏

  • B 任务完成,但是状态已经为ProgressBar(错误)

我以为我可以维护IDLE个对象中的一个Collection(就像在每个任务中单独使用一个LiveData一样),但这似乎很麻烦。

是否有惯用的方式来处理此问题?

(也欢迎Java回答)

1 个答案:

答案 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--
}