我正在Kotlin中实现一个AsyncTask
,并且我需要在onPostExecute()
方法中运行的回调中使用WeakReference
。在调用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,因此它持有对我的活动的引用。活动永远不会被重新创建,我的手机在AsyncTask启动后仍然静止,从未旋转或触摸。那么WeakReference
如何清除?