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

标签 android android-livedata

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/

相关文章:

java - Android 中如何暂停后台运行的应用程序?

android - 如何在Android中创建一个文件,将其保存在Download文件夹中,并在通知栏中显示文件下载通知?

android - 如何获取 ListAdapter<Model,ViewHolder::class> 的列表

android - Retrofit LiveDataCallAdapter 不调用函数 adapt(call)

android - android ActionBar 中 EditText 上的 addTextChangedListener()

java - Android View onResume 方法?

java - 如何让 Glide 与 Android Studio 3.0 配合使用?

java - ViewModel 没有零参数构造函数错误 - 即使它具有零参数构造函数

android - fragment 中的 ViewModelProvider 使用什么 ViewModelStoreOwner?

android - LiveDataScope 发出不调用