Я реализую AsyncTask
в Котлине, и мне нужен WeakReference
для обратного вызова, который работает в методе onPostExecute()
. Я устанавливаю ссылку слушателя перед вызовом execute()
, но как только вызывается onPostExecute()
, значение WeakReference
равно null
.WeakReference не работает в Kotlin
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
изменяет интерфейс моей деятельности, в поэтому содержит ссылку на мою деятельность. Активность никогда не воссоздается, мой телефон по-прежнему, никогда не поворачивается или не трогается после запуска AsyncTask. Как очищается WeakReference
?
Вы передаете локальную переменную как «слушатель»? Хранит ли он где-то в другом месте, например. в собственности Деятельности? – hotkey
yes Я передаю локальную переменную, но я ее нигде не храню – gesuwall