invokeAndWait
:
PersistentStateComponent
初始化生存期方法:
loadState
noStateLoaded
initializeComponent
在服务初始化期间运行读/写操作或调用 invokeAndWait
可能会导致死锁。
示例:
Kotlin:
@Service
internal class MyService {
private val myData = initMyData();
constructor() {
val data = runReadAction { // 错误:在构造函数中运行读取操作
// 读取数据
}
}
private fun initMyData(): Data {
return runWriteAction { // 错误:在初始化 myData 属性时调用
// 写入数据
}
}
companion object {
lateinit var companionData: String
init {
companionData = runReadAction { // 错误:在 init 块中运行读取操作
// 读取数据
}
}
}
}
Java:
@Service
class MyService {
private static final Data ourData1 = ReadAction.compute(() -> {
// 读取数据
});
private static final Data ourData2;
static {
ourData2 = ReadAction.compute(() -> { // 错误:在 static 初始化块中运行读取操作
// 读取数据
});
}
private final Data myData2 = initMyData();
MyService() {
Data data = WriteAction.compute(() -> { // 错误:在构造函数中运行读取操作
// 写入数据
});
}
private Data initMyData() {
return ReadAction.compute(() -> { // 错误:在初始化 myData 属性时调用
// 读取数据
});
}
}
PersistentStateComponent
:
@Service
@State(...)
internal class MySettings : PersistentStateComponent<MyService> {
var stateValue: String? = null
override fun loadState(state: MySettings) {
val data = runReadAction { // 错误:在 loadState 中运行读取操作
// 读取数据
}
// ...
}
override fun noStateLoaded() {
val data = runWriteAction { // 错误:在 noStateLoaded 中运行读取操作
// 写入数据
}
// ...
}
override fun initializeComponent() {
val data = runReadAction { // 错误:在 initializeComponent 中运行读取操作
// 读取数据
}
// ...
}
}
2024.2 最新变化