As the document says about the Livedata#postValue(T) :
If you called this method multiple times before a main thread executed a 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/