使用 Firebase 实时数据库时启动新线程的最佳做法是什么?
What is the best practice for starting a new thread when using Firebase Realtime Database?
我正在按照此 blog 将 Android 架构组件与 Firebase 实时数据库一起使用。目前,我在博客的一部分将 LiveData
回调移动到 onChanged()
到不同的线程。
这就是我所拥有的(相当于博客中 Java 代码的 Kotlin):
private val uid = Firebase.auth.currentUser!!.uid
private val USERS_REF: DatabaseReference = FirebaseDatabase.getInstance().getReference("/users/$uid")
private val liveData: FirebaseQueryLiveData = FirebaseQueryLiveData(USERS_REF)
private val usersLiveData: MediatorLiveData<Users> = MediatorLiveData()
fun UsersViewModel() {
usersLiveData.addSource(liveData, object : Observer<DataSnapshot> {
override fun onChanged(dataSnapshot: DataSnapshot?) {
if (dataSnapshot != null) {
Thread(Runnable() {
run() {
usersLiveData.postValue(dataSnapshot.getValue(Users::class.java))
}
}).start()
} else {
usersLiveData.value = null
}
}
})
}
在博客中,它指出它显示的启动新线程的方式不被视为在生产应用程序中启动另一个线程的“最佳实践”。建议是使用 Executor
和可重用线程池来完成这样的工作。
如何修改当前的可运行线程,使其使用最佳实践来启动新线程?
您在这里根本不需要新线程。删除它即可。
postValue()
是异步的,不会阻塞任何东西。您可以在主线程上安全地调用它。任何 LiveData 观察者将在数据库回调完成后立即获得该值。
我正在按照此 blog 将 Android 架构组件与 Firebase 实时数据库一起使用。目前,我在博客的一部分将 LiveData
回调移动到 onChanged()
到不同的线程。
这就是我所拥有的(相当于博客中 Java 代码的 Kotlin):
private val uid = Firebase.auth.currentUser!!.uid
private val USERS_REF: DatabaseReference = FirebaseDatabase.getInstance().getReference("/users/$uid")
private val liveData: FirebaseQueryLiveData = FirebaseQueryLiveData(USERS_REF)
private val usersLiveData: MediatorLiveData<Users> = MediatorLiveData()
fun UsersViewModel() {
usersLiveData.addSource(liveData, object : Observer<DataSnapshot> {
override fun onChanged(dataSnapshot: DataSnapshot?) {
if (dataSnapshot != null) {
Thread(Runnable() {
run() {
usersLiveData.postValue(dataSnapshot.getValue(Users::class.java))
}
}).start()
} else {
usersLiveData.value = null
}
}
})
}
在博客中,它指出它显示的启动新线程的方式不被视为在生产应用程序中启动另一个线程的“最佳实践”。建议是使用 Executor
和可重用线程池来完成这样的工作。
如何修改当前的可运行线程,使其使用最佳实践来启动新线程?
您在这里根本不需要新线程。删除它即可。
postValue()
是异步的,不会阻塞任何东西。您可以在主线程上安全地调用它。任何 LiveData 观察者将在数据库回调完成后立即获得该值。