Это нормально для класса ViewModel, реализующего LifecycleObserver? - PullRequest
0 голосов
/ 16 декабря 2018

Чтение обзора ViewModel . Интересно, нормально ли для ViewModel одновременно стать LifecycleObserver?Моя цель заключается в том, чтобы отключить прослушиватель Firebase, когда пользователь не взаимодействует с пользовательским интерфейсом, и снова подключить его, когда пользователь взаимодействует с пользовательским интерфейсом.Насколько я сделал и знаю, это работает отлично.Но я боюсь, если это будет плохо (утечка памяти вообще).И если да, есть ли альтернатива этому?

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
    }
}
...