说我有一个记录功能:
fun log(message: String)
不幸的是,这个函数将从协同程序和协同程序之外调用。在协同程序的情况下,我想记录来自协程上下文的其他信息(例如,协程的名称)。
我怎样才能做到这一点?
这些是我的想法,但我没有解决方案:
log
内部弄清楚它是否在协程内并获得coroutineContext
。这可能吗?log
,例如log
和logSuspend
。但是我如何确保调用正确的人?如果我在suspend
里面,没有什么能阻止我意外地打电话给log
。另外,我可能有一个常规的帮助函数。它应该叫哪一个?ThreadLocal
的东西,例如我可以在coroutineContext
内部ThreadLocal
,但我如何确保它保持最新?如果它在协程内部并获得coroutineContext,以某种方式弄清楚内部日志。这可能吗?
我认为没有一个好的解决方案。
我会创建两个log
函数,第一个用于通用,第二个 - 在CoroutineScope
上用于协程的扩展函数:
fun log(message: String) {...}
fun CoroutineScope.log(message: String) {
//here you can access coroutineContext
}
如果你从coroutine调用log
函数,如下所示:
GlobalScope.launch {
log("CoroutineScope.log")
}
将调用扩展函数,您将可以访问coroutineContext。
注意:不建议使用GlobalScope,它仅用于演示目的。