繁体   English   中英

对函数类型参数null行为的弱引用

[英]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。

  1. 在应用运行时,通过按Run(Shift + F10)通过Android Studio重新启动应用。 该应用程序将关闭,重新启动,并且之前有项目的RecyclerView现在为空白。 通过一些sysout,我可以看到WeakReference具有空引用。
  2. 在通过FAB将新项目添加到列表(通过DAO实例处理插入)并查看我的日志时,大多数时候,WeakReference仍在引用我的MediatorLiveData的setValue()函数,但在随机时间,它将为null,但是下次我插入一个项目并且此过程重复时,它不为null。

知道为什么会这样吗? 如果我的ViewModel以及MediatorLiveData仍然处于活动状态并且没有被垃圾回收,那么MediatorLiveData的setValue()函数引用是否在整个时间内都无效?

当您的方法MediatorLiveData::addSource返回时,就没有对您的功能接口(您要在其中调用mMediatorLiveData::setValue )的强引用,这意味着它可以用于GC。

从来没有实例变量引用函数本身,而只是方法参数。

只要需要,就应该保留对功能接口本身的引用,以便它可以调用setValue

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM