帮我用Kotlin协程做一个和AsyncTask功能相同的工具
时间: 2024-06-10 09:10:07 浏览: 109
好的,以下是一个使用Kotlin协程实现的类,它提供了和AsyncTask相同的功能:
```
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class CoroutineTask<T>(private val task: () -> T) {
private var onPreExecute: (() -> Unit)? = null
private var onPostExecute: ((T) -> Unit)? = null
private var onCancelled: (() -> Unit)? = null
private lateinit var job: kotlinx.coroutines.Job
fun execute() {
job = CoroutineScope(Dispatchers.Main).launch {
onPreExecute?.invoke()
val result = withContext(Dispatchers.Default) { task.invoke() }
onPostExecute?.invoke(result)
}
}
fun cancel() {
if (::job.isInitialized) {
job.cancel()
onCancelled?.invoke()
}
}
fun onPreExecute(action: () -> Unit) {
onPreExecute = action
}
fun onPostExecute(action: (T) -> Unit) {
onPostExecute = action
}
fun onCancelled(action: () -> Unit) {
onCancelled = action
}
}
```
使用示例:
```
val task = CoroutineTask<String> {
// 在后台线程执行的任务
"result"
}
task.onPreExecute {
// 在主线程执行的操作,例如显示进度条
}
task.onPostExecute { result ->
// 在主线程执行的操作,例如更新UI
}
task.onCancelled {
// 在主线程执行的操作,例如隐藏进度条
}
task.execute()
// 取消任务
// task.cancel()
```
阅读全文