ViewModel class 实现 LifecycleObserver 可以吗?
Is it okay for a ViewModel class implementing LifecycleObserver?
阅读ViewModel overview,我想知道ViewModel
是否也可以同时成为LifecycleObserver
?我这样做的目的是在用户未与 UI 交互时断开 Firebase 侦听器,并在用户与 UI 交互时重新连接它。据我所知,它工作得很好。但是,我担心这样做不好(无论如何内存泄漏)。如果是这样,还有其他选择吗?
class UserProfileViewModel : ViewModel(), LifecycleObserver {
companion object {
private const val TAG = "ProfileViewModel"
}
private lateinit var mUserProfile: MutableLiveData<DocumentSnapshot>
private var mRegistration: ListenerRegistration? = null
override fun onCleared() {
Log.d(TAG, "onCleared")
disconnectListener()
}
fun getUserProfile(): LiveData<DocumentSnapshot> {
if (!::mUserProfile.isInitialized) {
mUserProfile = MutableLiveData()
}
return mUserProfile
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun connectListener() {
Log.d(TAG, "connectListener")
val user = FirebaseAuth.getInstance().currentUser
if (user == null) {
Log.w(TAG, "User not signed in.")
return
}
val firestore = FirebaseFirestore.getInstance()
val docRef = firestore.collection(UsersContract.COLLECTION_NAME).document(user.uid)
mRegistration = docRef.addSnapshotListener { snapshot, exception ->
if (exception != null) {
Log.w(TAG, "Failed to fetch user data", exception)
return@addSnapshotListener
}
if (snapshot != null && snapshot.exists()) {
mUserProfile.value = snapshot
}
}
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun disconnectListener() {
Log.d(TAG, "disconnectListener")
mRegistration?.remove()
mRegistration = null
}
}
如果您不担心将侦听器限定在 resume/pause 范围内。您可以使用自定义实时数据来实现此目的。
您可以拥有自定义实时数据,例如扩展实时数据的 UserProfileLiveData。
参考扩展实时数据 -
https://developer.android.com/topic/libraries/architecture/livedata#extend_livedata
阅读ViewModel overview,我想知道ViewModel
是否也可以同时成为LifecycleObserver
?我这样做的目的是在用户未与 UI 交互时断开 Firebase 侦听器,并在用户与 UI 交互时重新连接它。据我所知,它工作得很好。但是,我担心这样做不好(无论如何内存泄漏)。如果是这样,还有其他选择吗?
class UserProfileViewModel : ViewModel(), LifecycleObserver {
companion object {
private const val TAG = "ProfileViewModel"
}
private lateinit var mUserProfile: MutableLiveData<DocumentSnapshot>
private var mRegistration: ListenerRegistration? = null
override fun onCleared() {
Log.d(TAG, "onCleared")
disconnectListener()
}
fun getUserProfile(): LiveData<DocumentSnapshot> {
if (!::mUserProfile.isInitialized) {
mUserProfile = MutableLiveData()
}
return mUserProfile
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun connectListener() {
Log.d(TAG, "connectListener")
val user = FirebaseAuth.getInstance().currentUser
if (user == null) {
Log.w(TAG, "User not signed in.")
return
}
val firestore = FirebaseFirestore.getInstance()
val docRef = firestore.collection(UsersContract.COLLECTION_NAME).document(user.uid)
mRegistration = docRef.addSnapshotListener { snapshot, exception ->
if (exception != null) {
Log.w(TAG, "Failed to fetch user data", exception)
return@addSnapshotListener
}
if (snapshot != null && snapshot.exists()) {
mUserProfile.value = snapshot
}
}
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun disconnectListener() {
Log.d(TAG, "disconnectListener")
mRegistration?.remove()
mRegistration = null
}
}
如果您不担心将侦听器限定在 resume/pause 范围内。您可以使用自定义实时数据来实现此目的。 您可以拥有自定义实时数据,例如扩展实时数据的 UserProfileLiveData。
参考扩展实时数据 - https://developer.android.com/topic/libraries/architecture/livedata#extend_livedata