协程原理之如何实现非阻塞式挂起
普通callback实现
与协程异步代码同步写法对比
callback实现代码
|
1 | //CallbackImpl.ktabstract 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.CALLBACKenum 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 |
|