task = object : LongTask("$idx"){
override fun onProgressUpdate(vararg values: String?) {
super.onProgressUpdate(*values)
Log.d(TAG, "On UI thread")
}
}
Эта строка создаст анонимный внутренний класс, который выходит из LongTask
класса.Внутренний класс имеет неявную ссылку на свой внешний класс, в данном случае MainActivity
class.
Если действие завершено до завершения асинхронной задачи, то GC будет пропускать или не собирать действие, потому что оно все еще передается в асинхронной задаче.
Решение: КИзбегайте использования API WeakReference
.Кроме того, LongTask
- это отдельный класс, поэтому нам нужно определить интерфейс для передачи данных обратно в действие.
Сначала объявите интерфейс
OnProgressUpdateListener.kt
interface OnProgressUpdateListener {
fun onProgressUpdate(vararg values: String?)
}
Во-вторых, измените класс asynctask.Просто сосредоточьтесь на OnProgressUpdateListener
части, потому что я не знаю, как именно выглядит ваш класс.
LongTask.kt
class LongTask(val idx: String, listener: OnProgressUpdateListener) : AsyncTask<String, String, Unit>() {
private val mListener: WeakReference<OnProgressUpdateListener>? = WeakReference(listener)
override fun doInBackground(vararg params: String?) {
}
override fun onProgressUpdate(vararg values: String?) {
mListener?.get()?.onProgressUpdate(*values)
}
}
Наконец, позвольте заданию реализоватьOnProgressUpdateListener
.
MainActivity.kt
class MainActivity : AppCompatActivity(), OnProgressUpdateListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
task = LongTask("$idx", this)
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "")
}
override fun onProgressUpdate(vararg values: String?) {
// Update your progress on UI thread here
Log.d(TAG, "On UI thread")
}
}