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

本文探讨了Kotlin协程的高级用法,包括异常处理、使用场景以及与传统方法的对比。内容涵盖异常冒泡、协程的生命周期管理、返回值处理,以及如何在不支持取消的情况下处理资源。此外,还讨论了如何在不崩溃应用的同时记录异常,提供了一种使用CoroutineExceptionHandler的日志记录策略。文章适合Android开发者和准备面试的人员阅读。
摘要由CSDN通过智能技术生成

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、付费专栏及课程。

余额充值