【发布时间】:2016-05-04 23:34:31
【问题描述】:
我在 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 变量修改了我的活动的 UI,因此它包含对我的活动的引用。 Activity 永远不会重新创建,我的手机在 AsyncTask 启动后从未旋转或触摸过。 WeakReference是怎么清除的??
【问题讨论】:
-
您是否将局部变量作为
listener传递?它是否存储在其他地方,例如在 Activity 的属性中? -
是的,我传递了一个局部变量,但我没有将它存储在任何地方