gpt4 book ai didi

android - 弱引用在 Kotlin 中不起作用

转载 作者:IT老高 更新时间:2023-10-28 13:33:23 24 4
gpt4 key购买 nike

我正在 Kotlin 中实现一个 AsyncTask,我需要一个 WeakReference 用于在 onPostExecute() 方法中运行的回调。我在调用execute()之前设置了监听器引用,但是一旦调用了onPostExecute()WeakReference的值就是null

class PhotoRotationTask(uri: Uri, filePath: String, resolver: ContentResolver) : AsyncTask<Int, Int, Int>() {
private var weakRef : WeakReference<OnBitmapProcessedListener>? = null

var sourceUri : Uri
var resolver : ContentResolver
var destPath: String

init {
this.sourceUri = uri
this.resolver = resolver
this.destPath = filePath
}

fun setOnBitmapProcessedListener(listener: OnBitmapProcessedListener){
weakRef = WeakReference(listener)
Log.d("RotationTask", "set listener ${weakRef?.get() != null}") //This Log proves that weakRef is initialized before onPostExecute()
}

override fun doInBackground(vararg params: Int?): Int? {
//Bitmap processing, weakRef is never called in this function
}

override fun onPostExecute(result: Int?) {
Log.d("RotationTask", "result: $result") //This log proves that onPostExecute() is called eventually
weakRef!!.get()?.onBitmapProcessed() //This implies that weakRef is not null, because app never crashes, but onBitmapProcessed is not called, so the reference is gone.
}

}

listener 变量修改了我的 Activity 的 UI,因此它包含对我的 Activity 的引用。 Activity 永远不会重新创建,我的手机在 AsyncTask 启动后是静止的,永远不会旋转或触摸。 WeakReference是如何清除的??

最佳答案

问题出在 WeakReference和作为 listener 传递的局部变量。

WeakReferenceknown not to keep an object from being garbage collected ,因此如果没有其他可访问的强引用,一旦通过局部变量引用它的方法完成,它可能随时被回收。这正是您的情况发生的情况,因为弱引用变为 null

解决方案是在调用代码的某处存储对作为 listener 传递的对象的强引用(当它使用 Activity 时, Activity 本身可能存储它在一个属性中,以便 listener 的生命周期与 Activity 的生命周期相匹配)。

例如,声明一个属性

lateinit var currentListener: OnBitmapProcessedListener

在 Activity 代码中,然后将您创建的 listener 存储在该属性中:

val task = PhotoRotationTask(uri, filePath, resolver)

task.setOnBitmapProcessedListener(object : OnBitmapProcessedListener {
// here goes the implementation
}.apply { currentListener = this } // note this line
)

如果可能有多个任务和监听器,请注意存储所有监听器。

关于android - 弱引用在 Kotlin 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37039856/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com