私はAsyncTask
をKotlinに実装しています。onPostExecute()
メソッドで実行されるコールバックにはWeakReference
が必要です。を呼び出す前にリスナー参照を設定しましたが、が呼び出されると、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
変数は、したがって、それは私の活動への参照を保持している、私の活動のUIを変更します。 AsyncTaskの起動後も、アクティビティは決して再作成されず、私の電話は静止していたり、回転したり触れたりすることはありません。 WeakReference
はどのようにクリアされていますか?
ローカル変数を 'listener'として渡しますか?他の場所に保存されていますか?アクティビティのプロパティで? – hotkey
はい私はローカル変数を渡しますが、どこにも格納しません – gesuwall