Kotlin回调函数转协程

Posted 一杯清泉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin回调函数转协程相关的知识,希望对你有一定的参考价值。

        回调函数转协程通常使用两个协程相关的类:suspendCancellableCoroutine和suspendCoroutine,前者可以通过cancel()方法手动取消协程的执行,而suspendCoroutine没有该方法,调用cancel()后协程不再往下执行,抛出 CancellationException 异常,但是程序不会崩溃,这样会更加安全,通常推荐使用suspendCancellableCoroutine。

一、原始的回调方法

interface OnClickListener 
    fun onConfirm(index: Int)
    fun onCancel()


private fun method(listener: OnClickListener) 
    thread 
        Thread.sleep(3000)
        listener.onConfirm(3)
    


private fun execute() 
    method(object : OnClickListener 
        override fun onConfirm(index: Int) 
            Log.d("TAG", "onConfirm: $index")
        

        override fun onCancel() 
            Log.d("TAG", "onCancel: ")
        
    )

二、使用协程

        suspendCancellableCoroutine接收一个匿名函数,参数为CancellableContinuation,他继承自Continuation,最常用的三个方法resume,resumeWith和resumeWithException。

private suspend fun execute(): Int 
    return suspendCancellableCoroutine 
        method(object : OnClickListener 
            override fun onConfirm(index: Int) 
                if (it.isCancelled) 
                    return
                
                it.resumeWith(Result.success(index))
            

            override fun onCancel() 
                it.resumeWith(Result.failure(Exception()))
            
        )
    

使用:


lifecycleScope.launch
    val result = execute()
    Log.d("TAG", "result: $result")

以上是关于Kotlin回调函数转协程的主要内容,如果未能解决你的问题,请参考以下文章

深入理解Kotlin协程如何将回调改写成挂起函数

如何使用 kotlin 协程处理回调

Kotlin Coroutines 的现有 3 函数回调

kotlin协程硬核解读(1. 协程初体验)

kotlin协程硬核解读(1. 协程初体验)

深入理解Koltin协程:为什么学习 Kotlin 协程?