【问题标题】:Handling loading states of multiple threads in Activity处理Activity中多线程的加载状态
【发布时间】:2018-10-02 10:50:50
【问题描述】:

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

这些任务可以是网络调用或数据库操作,在不同的后台线程上运行。

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

我已经搜索过解决方案,人们似乎将LiveData 用于类似目的。

所以我想我会在ActivityViewModel 中创建一个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/完成。

标签: java android kotlin


【解决方案1】:

我有一个简单的想法

在视图模型中使用这样的变量

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    相关资源
    最近更新 更多