协程原理之如何实现非阻塞式挂起

普通callback实现

与协程异步代码同步写法对比

callback实现代码

|

1
//CallbackImpl.kt‭​​‌‌‎‭‬​abstract class CallbackImpl(val callBack: CallBack<Any>): CallBack<Any> {‭​​‌‌‎‭‬​ ‭​​‌‌‎‭‬​    override fun onResult(result: Any?) {‭​​‌‌‎‭‬​        val cb = callBack‭​​‌‌‎‭‬​        while (true) {‭​​‌‌‎‭‬​            val outcome = invoke(result)‭​​‌‌‎‭‬​            if (outcome === CALLBACK_FLAG) {‭​​‌‌‎‭‬​                return‭​​‌‌‎‭‬​            }‭​​‌‌‎‭‬​ ‭​​‌‌‎‭‬​            cb.onResult(outcome)‭​​‌‌‎‭‬​            return‭​​‌‌‎‭‬​        }‭​​‌‌‎‭‬​    }‭​​‌‌‎‭‬​ ‭​​‌‌‎‭‬​    protected abstract fun invoke(result: Any?): Any?‭​​‌‌‎‭‬​}‭​​‌‌‎‭‬​ ‭​​‌‌‎‭‬​val CALLBACK_FLAG = CoroutineSingletons.CALLBACK‭​​‌‌‎‭‬​enum class CoroutineSingletons { CALLBACK }‭​​‌‌‎‭‬​ ‭​​‌‌‎‭‬​interface CallBack<T> {‭​​‌‌‎‭‬​    fun onResult(result: T?)‭​​‌‌‎‭‬​}‭​​‌‌‎‭‬​object UserInfoHelper {‭​​‌‌‎‭‬​    fun launch() {‭​​‌‌‎‭‬​        Log.e("MainActivity", "launch run")‭​​‌‌‎‭‬​        requestUserCallback(object : CallBack<Any> {‭​​‌‌‎‭‬​            override fun onResult(result: Any?) {‭​​‌‌‎‭‬​                Log.e("MainActivity", "launch result: $result")‭​​‌‌‎‭‬​            }‭​​‌‌‎‭‬​        })‭​​‌‌‎‭‬​    }‭​​‌‌‎‭‬​ ‭​​‌‌‎‭‬​    val handler = Handler(Looper.getMainLooper())‭​​‌‌‎‭‬​    private fun delay(timeMillis: Long, callBack: CallBack<Any>): Any {‭​​‌‌‎‭‬​        handler.postDelayed({‭​​‌‌‎‭‬​            callBack.onResult(Unit)‭​​‌‌‎‭‬​        }, timeMillis)‭​​‌‌‎‭‬​        return CALLBACK_FLAG‭​​‌‌‎‭‬​    }‭​​‌‌‎‭‬​ ‭​​‌‌‎‭‬​    //正常情况下应该保持到协程的context中,这样写为了简单处理‭​​‌‌‎‭‬​    private var userCallback:UserCallback? = null‭​​‌‌‎‭‬​    abstract class UserCallback(callBack: CallBack<Any>) : CallbackImpl(callBack) {‭​​‌‌‎‭‬​        var result: Any? = null‭​​‌‌‎‭‬​        var flag: Int = 0‭​​‌‌‎‭‬​    }‭​​‌‌‎‭‬​ ‭​​‌‌‎‭‬​    fun requestUserCallback(callBack: CallBack<Any>): Any {‭​​‌‌‎‭‬​        val cb = if (userCallback == null) {‭​​‌‌‎‭‬​            val c = object : UserCallback(callBack) {‭​​‌‌‎‭‬​                override fun invoke(result: Any?): Any? {‭​​‌‌‎‭‬​                    this.result = result‭​​‌‌‎‭‬​                    ++flag‭​​‌‌‎‭‬​                    return requestUserCallback(this)‭​​‌‌‎‭‬​                }‭​​‌‌‎‭‬​            }‭​​‌‌‎‭‬​            userCallback = c‭​​‌‌‎‭‬​            c‭​​‌‌‎‭‬​        }else {‭​​‌‌‎‭‬​            userCallback!!‭​​‌‌‎‭‬​        }‭​​‌‌‎‭‬​ ‭​​‌‌‎‭‬​        var returnResult = cb.result‭​​‌‌‎‭‬​        when (cb.flag) {‭​​‌‌‎‭‬​            0 -> {‭​​‌‌‎‭‬​                if (requestFriendListCallback(cb) == CALLBACK_FLAG) {‭​​‌‌‎‭‬​                    return CALLBACK_FLAG‭​​‌‌‎‭‬​                }‭​​‌‌‎‭‬​            }‭​​‌‌‎‭‬​ ‭​​‌‌‎‭‬​            1 -> {‭​​‌‌‎‭‬​                returnResult = cb.result‭​​‌‌‎‭‬​            }‭​​‌‌‎‭‬​        }‭​​‌‌‎‭‬​ ‭​​‌‌‎‭‬​        return "user: $returnResult"‭​​‌‌‎‭‬​    }‭​​‌‌‎‭‬​ ‭​​‌‌‎‭‬​    //正常情况下应该保持到协程的context中,这样写为了简单处理‭​​‌‌‎‭‬​    var requestFriendListCallback: RequestFriendListCallback? = null‭​​‌‌‎‭‬​    abstract class RequestFriendListCallback(callBack: CallBack<Any>) : CallbackImpl(callBack) {‭​​‌‌‎‭‬​        var result: Any? = null‭​​‌‌‎‭‬​        var flag: Int = 0‭​​‌‌‎‭‬​    }‭​​‌‌‎‭‬​ ‭​​‌‌‎‭‬​    fun requestFriendListCallback(callBack: CallBack<Any>): Any {‭​​‌‌‎‭‬​ ‭​​‌‌‎‭‬​        val cb = if ( requestFriendListCallback == null) {‭​​‌‌‎‭‬​            val c = object : RequestFriendListCallback(callBack) {‭​​‌‌‎‭‬​                override fun invoke(result: Any?): Any? {‭​​‌‌‎‭‬​                    this.result = result‭​​‌‌‎‭‬​                    ++flag‭​​‌‌‎‭‬​                    return requestFriendListCallback(this)‭​​‌‌‎‭‬​                }‭​​‌‌‎‭‬​            }‭​​‌‌‎‭‬​            requestFriendListCallback = c‭​​‌‌‎‭‬​            c‭​​‌‌‎‭‬​        } else {‭​​‌‌‎‭‬​            requestFriendListCallback!!‭​​‌‌‎‭‬​        }‭​​‌‌‎‭‬​ ‭​​‌‌‎‭‬​        when (cb.flag) {‭​​‌‌‎‭‬​            0 -> {‭​​‌‌‎‭‬​                if (delay(3000, cb) == CALLBACK_FLAG) {‭​​‌‌‎‭‬​                    return CALLBACK_FLAG‭​​‌‌‎‭‬​                }‭​​‌‌‎‭‬​            }‭​​‌‌‎‭‬​ ‭​​‌‌‎‭‬​            1 -> {‭​​‌‌‎‭‬​ ‭​​‌‌‎‭‬​            }‭​​‌‌‎‭‬​        }‭​​‌‌‎‭‬​ ‭​​‌‌‎‭‬​        return "friendList"‭​​‌‌‎‭‬​    }‭​​‌‌‎‭‬​}‭​​‌‌‎‭‬​

|

协程反编译字节码

|

1

|