gpt4 book ai didi

android - 在 Livedata 上多次调用 postValue() 将导致仅发送最后一个。有没有其他解决方案?

转载 作者:行者123 更新时间:2023-12-05 02:43:54 26 4
gpt4 key购买 nike

As the document says about the Livedata#postValue(T) :

If you called this method multiple times before a main thread executeda posted task, only the last value would be dispatched.

但我确实需要在短时间内多次调用 Livedata 上的 postValue()。我正在设计一个具有下载功能的应用程序。我在 AndroidViewmodel 中编写下载代码,并为每个异步下载任务启动一个新线程。一旦每个任务完成,它就会 postValue() 到一个 Livedata,因此可能有许多任务同时向同一个 Livedata 发布值,这导致只有最后一个发布有效。

有什么方法可以让我同时对 Livedata 多次 postValue() 并确保所有相关观察者对所有发布使用react?

------我的代码示例如下----------------

在 AndroidViewModel 类中:

private MutableLiveData<DataHolder_Task> completedTask;
......
public void bulkDownload(List<DataHolder_Task> tasks){
new Thread(new Runnable() {
@Override
public void run() {
for(DataHolder_Task task:tasks)
{
//download() blocks untill task completed
download(task);
completedTask.postValue(task);
}
}
}).start();
}

public MutableLiveData<DataHolder_Task> getCompletedTask() {
if(completedTask==null){
completedTask=new MutableLiveData<>();
}
return completedTask;
}

在 Activity 中:

    androidViewModel.bulkDownload(a_list_of_tasks)
androidViewModel.getCompletedTask().observe(this, new Observer<DataHolder_Task>() {
@Override
public void onChanged(DataHolder_Task task) {
doSomething(task)
}
});

最佳答案

我通过子类 MutableLiveData 实现了这一点,添加了一个队列来缓冲大量的实时数据,然后一个一个地分发到主线程:

import androidx.lifecycle.MutableLiveData
import java.util.*

class QueuedMutableLiveData<T> : MutableLiveData<T>() {
private val queue = LinkedList<T?>()

override fun setValue(value: T) {
super.setValue(value)
synchronized(queue) {
queue.pollFirst()
queue.peekFirst()?.run {
super.postValue(this)
}
}
}

override fun postValue(value: T?) {
synchronized(queue) {
queue.add(value)
if (queue.size == 1) {
super.postValue(value)
}
}
}
}

关于android - 在 Livedata 上多次调用 postValue() 将导致仅发送最后一个。有没有其他解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66724421/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com