如何从一个非挂起函数中获取当前的`coroutineContext`?

时间:2019-02-13 01:27:19

标签: kotlin kotlinx.coroutines kotlin-coroutines

说我有一个日志记录功能:

fun log(message: String)

不幸的是,该函数会在协程中和协程外部被调用。对于协程,我想记录来自协程上下文的其他信息(例如,协程的名称)。

我该如何实现?

这些是我的想法,但我没有解决办法:

  • 以某种方式找出log内部是否存在于协程中并得到coroutineContext。这可能吗?
  • 我可以有两个log版本,例如loglogSuspend。但是,我如何确保正确的人被呼叫?如果我在suspend内,则不会阻止我意外地致电log。此外,我可能会定期提供帮助功能。应该叫哪个?
  • 例如,有些东西ThreadLocal可以用coroutineContext放在ThreadLocal里面,但是如何确保它保持最新状态?

1 个答案:

答案 0 :(得分:0)

  

以某种方式找出日志中是否包含在协程中并获取   coroutineContext。这可能吗?

我认为没有很好的解决方案。

我将创建两个log函数,第一个用于一般用途,第二个-在CoroutineScope上用于协程的扩展函数:

fun log(message: String) {...}

fun CoroutineScope.log(message: String) {
    //here you can access coroutineContext
}

如果您从协程调用log函数,如下所示:

GlobalScope.launch {
    log("CoroutineScope.log")
}

扩展功能将被调用,您将可以访问 coroutineContext

注意:不建议使用 GlobalScope ,它仅用于演示目的。