[译] Kotlin 协程高级使用技巧,最新2021年Android大厂面试经验

public suspend inline fun <T : Closeable?, R> T.useCancellably(
crossinline block: (T) -> R
): R = suspendCancellableCoroutine { cont ->
cont.invokeOnCancellation { this?.close() }
cont.resume(use(block))
}

确保这适用于你正在使用的 API !

现在阻塞的 accept 调用被 useCancellably 包裹,该协程会在超时触发的时候失败。

runBlocking(Dispatchers.IO) {
withTimeout(1000) {
val socket = ServerSocket(42)

// 抛出 SocketException: socket closed 异常。好极了!
socket.useCancellably { it.accept() }
}
}

成功!

如果你不支持取消怎么办?以下是你需要注意的事项:

  • 如果你使用协程封装类中的任何属性或方法,即使取消了协程也会存在泄漏。如果你认为你正在 onDestroy 中清理资源,这尤其重要。解决方法: 将协同程序移动到 ViewModel 或其他上下文无关的类中并订阅它的处理结果。
  • 确保使用 Dispatchers.IO 来处理阻塞操作,因为这可以让 Kotlin 留出一些线程来进行无限等待。
  • 尽可能使用 suspendCance
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值