Не удается закрыть экземпляр Realm в ViewModel, связанном с Activity - PullRequest
2 голосов
/ 10 апреля 2019

У меня есть приложение с одним действием , и к нему прикреплено SharedViewModel, его основное назначение - использовать его для внутренней связи между фрагментами и т. Д. Я также использую Realm как решение для хранения. Эта viewModel, как и другие viewModel, расширяет BaseViewModel.

open class BaseViewModel(): ViewModel() {

    val  realm: Realm = Realm.getDefaultInstance()

    override fun onCleared() {
        super.onCleared()
        realm.close()
        Log.d("BVM", "realm is ${ if (realm.isClosed) "closed." else "not closed.  Opened connections: ${Realm.getLocalInstanceCount(Realm.getDefaultConfiguration()!!)}"}")
    }
}

Мы все знакомы с этой картинкой enter image description here

Поскольку lyfecycle SharedViewModel зависит от жизненного цикла жизненного цикла действия, метод onCleared() этого viewModel будет вызываться не после onDestroy вызова действия, а после завершения действия. Это не одно и то же. В результате этого, когда я покидаю свое приложение, одно соединение Realm остается открытым, поскольку активность не находится в состоянии Завершено . Все остальные модели представления, связанные с фрагментами, вызвали свои собственные onCleared() методы, и связи их Царства закрыты.

Какой самый лучший и чистый способ справиться с этим?

У меня есть обходной путь, в котором я вызываю ViewModel onCleared() вручную в методе onDestroy, и он работает, но это решение - чушь.

Заранее спасибо!

1 Ответ

1 голос
/ 10 апреля 2019

На самом деле, @EpicPandaForce была права, ошибка была в создании ViewModel.Я использовал Dagger 2 для инъекции ViewModelFactory, который выглядит следующим образом:

@Singleton
class ViewModelFactory @Inject constructor(
        private val creators: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
) : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        val creator = creators[modelClass] ?: creators.entries.firstOrNull {
            modelClass.isAssignableFrom(it.key)
        }?.value ?: throw IllegalArgumentException("unknown model class $modelClass")
        try {
            @Suppress("UNCHECKED_CAST")
            return creator.get() as T
        } catch (e: Exception) {
            throw RuntimeException(e)
        }
    }
}

и ViewModel s, предоставленные этой фабрикой, не были привязаны к жизненному циклу какой-либо деятельности и фрагмента.Когда я изменил создание ViewModel как:

sharedViewModel = ViewModelProviders.of(this).get(SharedViewModel::class.java)

после OnDestroy() активности, onCleared() вызвали.

Спасибо, ребята!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...