无法在与Activity连接的ViewModel中关闭Realm实例

时间:2019-04-10 13:20:11

标签: android kotlin realm viewmodel

我具有单个活动应用,并且已附加SharedViewModel,其主要目的是用于片段之间的内部通信,等等。我还使用 Realm < / strong>作为存储解决方案。此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

由于SharedViewModel的生命周期取决于活动生命周期的生命周期,因此不是在onCleared()活动调用之后而是活动结束后调用此viewModel的onDestroy方法。这不是一回事。结果,当我离开我的应用程序时,一个Realm连接保持打开状态,因为活动未处于 Finished 状态。从片段连接的所有其他视图模型都调用了自己的onCleared()方法,并且其Realm的连接已关闭。

处理此问题的最佳方式是什么?

我有一个解决方法,其中我以onCleared()的活动方法手动调用viewModel的onDestroy,并且可以正常工作,但是该解决方案很垃圾。

谢谢!

1 个答案:

答案 0 :(得分:1)

事实上,@ 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不受任何活动和片段的生命周期的约束。当我将ViewModel的创建更改为:

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

OnDestroy()活动结束后,onCleared()被呼叫。

谢谢,伙计们!