[英]WeakReference to function type parameter null behavior
我了解,如果不再需要WeakReference作为强引用,则WeakReference将允许垃圾收集器清理其引用(例如,Activity被销毁或ViewModel被清除)。 但是我试图了解一种情况,当函数的拥有实例尚未被垃圾回收时,对函数的WeakReference在随机点返回空引用...
考虑以下ViewModel:
class SampleVM(dao: MyRoomDao) : ViewModel() {
private val mLiveData: LiveData<List<Object>> = dao.loadAll()
private val mMediatorLiveData: MediatorLiveData<List<Object>> = MediatorLiveData()
init {
mMediatorLiveData.addSource(mLiveData, { dbResult ->
MyAsyncTask(
mMediatorLiveData::setValue
).execute(dbResult ?: ArrayList())
})
...
}
我将原始LiveData的结果传递给AsyncTask以及对setValue的函数类型引用,以进行进一步处理,以便AsyncTask可以在onPostExecute()中调用中介程序的setValue()。
考虑以下AsyncTask:
class MyAsyncTask(onFinishCallback: (List<Object>) -> Unit) : AsyncTask<...,...,...>() {
private val mOnFinishCallback = WeakReference<(List<Object>) -> Unit>(onFinishCallback)
...(overrides)...
override fun onPostExecute(result: List<Object>?) {
result?.let {
mOnFinishCallback.get()?.invoke(it)
}
我认为只要在ViewModel上未调用onCleared()且未进行垃圾回收,WeakReference便始终包含非null引用。 但是碰巧我有两种情况看到mOnFinishCallback.get()返回null。
知道为什么会这样吗? 如果我的ViewModel以及MediatorLiveData仍然处于活动状态并且没有被垃圾回收,那么MediatorLiveData的setValue()函数引用是否在整个时间内都无效?
当您的方法MediatorLiveData::addSource
返回时,就没有对您的功能接口(您要在其中调用mMediatorLiveData::setValue
)的强引用,这意味着它可以用于GC。
从来没有实例变量引用函数本身,而只是方法参数。
只要需要,就应该保留对功能接口本身的引用,以便它可以调用setValue
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.