方法不被调用,没有错误,也许与泛型/伴随对象/继承/并发/内联有关
好的,所以我有一个名为ChannelBase的类,它是Slack中所有通道类型的超类(基本上只是通道和组,因为MPIM不再被认为是组)
在ChannelBase中有一个abstract class ChannelCompanion<T : BaseChannel<T>>
(泛型是子类的类型,又称Channel
或Group
)。 然后,子类将其伴随对象扩展为ChannelCompanion,强制它具有fromJson(JsonObject)
函数,并为伴随对象提供一个inline fun start(callback: () -> Unit)
,用于从Slack API收集频道列表并解析它。
所以基本上这里是我们所拥有的,我们假设我们正在注册Channel
类。 当Channel.start { }
(从ChannelCompanion继承)被调用时,下面是应该发生的事情:
– >拨打ChannelCompanion.start { }
– >将异步请求发送给一个懒散的小组的channels.list方法
– >解析JSON并检索Channel JsonObjects的数组
– >使用Channel.fromJson(JsonObject)
(ChannelCompanion中的抽象乐趣Channel.fromJson(JsonObject)
每个JsonObject解析为Channel对象Channel.fromJson(JsonObject)
问题是当Channel.fromJson
被调用时,Thread冻结。 没有错误或例外,它只是冻结。 如果你不明白这个结构(这很难解释),这里是存储库: https : //github.com/Deanveloper/SlaK/tree/master/src/main/kotlin/com/deanveloper/slak/渠道
调试代码显示,调用Channel.fromJson
时程序冻结。 Channel.fromJson
的第一行是打印该函数运行,并不打印。 它被调用之前的行被打印,虽然。 不太确定这里发生了什么事情。
值得注意的是,虽然有多个线程,但是这些都是在HTTP请求完成后在同一个线程中执行的。
如果你想克隆版本库并为自己测试, https://github.com/Deanveloper/SlaK 。 在JUnit测试目录中,转到BaseTest并将加密的API密钥替换为您自己的Slack团队的API密钥
它是由内联引起的,因为Json的函数有一个受保护的范围。 因为函数是内联的,所以fromJson函数实际上是从包外部调用的(因为启动方法是从包外部调用的)。 这导致了一个IllegalAccessError。