gpt4 book ai didi

android - 是否可以使用 Kotlin 将对象表达式用于 AsyncTask 声明/初始化?

转载 作者:行者123 更新时间:2023-11-29 01:03:05 28 4
gpt4 key购买 nike

我想做的是:

val myTask = object: AsyncTask<Unit,Unit,Unit>() {
{...}
}
myTask.execute()

或者更短:

(object : AsyncTask<Unit,Unit,Unit>() {
{...}
}).execute()

但它给了我“这个 AsyncTask 类应该是静态的,否则可能会发生泄漏 (...)”。而且似乎我不能像处理其他抽象类那样子类化和实例化 AsyncTask。看来我必须写所有的:

class BlaBla: AsyncTask<Unit,Unit,Unit>() {
{...}
}
BlaBla().execute()

为什么?

最佳答案

问题在于,当您在类的方法内创建匿名内部类或 lambda 时,它会引用其封闭类。因此,如果您创建一个内联对象,它将能够作为 this@MainActivity 访问封闭类,这就是导致此问题的原因。

但是,如果您编写这样的内容(代码很大程度上受 LruCache in android-ktx 启发),您所说的将成为可能:

inline fun executeTask(crossinline backgroundTask: () -> Unit): AsyncTask<Unit, Unit, Unit> =
executeTask<Unit, Unit, Unit>(
backgroundTask = { backgroundTask() },
postExecute = {}
)

inline fun executeTask(
crossinline backgroundTask: () -> Unit,
crossinline onPostExecute: () -> Unit = {}
): AsyncTask<Unit, Unit, Unit> =
executeTask<Unit, Unit, Unit>(
backgroundTask = { backgroundTask() },
postExecute = { onPostExecute() }
)

inline fun <Params, Progress, Result> executeTask(
vararg params: Params,
crossinline backgroundTask: (Array<out Params>) -> Result, //todo: publish progress needs this to have AsyncTask receiver
crossinline preExecute: () -> Unit = {},
crossinline postExecute: (Result) -> Unit = {},
crossinline progressUpdate: (Array<out Progress>) -> Unit = {},
crossinline onCancel: (Result?) -> Unit = {}
): AsyncTask<Params, Progress, Result> = object : AsyncTask<Params, Progress, Result>() {
override fun doInBackground(vararg params: Params): Result = backgroundTask(params)

override fun onPreExecute() = preExecute()

override fun onPostExecute(result: Result) = postExecute(result)

override fun onProgressUpdate(vararg values: Progress) = progressUpdate(values)

override fun onCancelled(result: Result?) = onCancel(result)
}.execute(*params)

哪个会让你做这样的事情:

executeTask(
backgroundTask = { ... },
onPostExecute = { ... }
)

但是你应该仍然不要直接在 Activity 中使用它,因为我上面提到过:在 executeTask 方法中创建的对象会创建一个异步任务,它可以活得比 Activity 长。

关于android - 是否可以使用 Kotlin 将对象表达式用于 AsyncTask 声明/初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49593775/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com