我尝试配置TornadoFX向导页面,而我的页面之一中有一个选项可供选择。此选择将调用较长时间的数据加载任务。因此,在页面上,当选择更改时,我只设置了一种代理值(BoardDefinition类型):
private fun loadBoard(def: BoardDefinition) {
scope.boardDef = def
}
这样,避免了用户做出决定时不必要地加载数据。我的意图是,只有当用户决定继续前进时,代理服务器才会放宽并加载数据。
我尝试将正在加载的部分移至onSave
,但是加载是异步的,向导将移至下一页(并且该页面尝试使用仍在加载中的数据):
override fun onSave() {
runAsync {
showProgress(
"Játéktábla betöltése",
"A játéktábla betöltése folyamatban",
ProgressDialog.ProgressMode.INDICATOR,
this
)
// This lazy initialization performs the long-time data loading
scope.board = scope.boardDef.board
} ui {
ProgressDialog.hide()
super.onSave()
}
}
我有几个解决此问题的方法。我可以创建一个Future对象,并在数据可用时阻止onSave的执行。或者,我可以添加一个仅加载数据的页面,并将onComplete属性设置为监视加载是否结束。两者看起来都像黑客入侵。当用户按下Next
时,是否有一种更优雅的方法来执行一些耗时的异步任务?
答案 0 :(得分:0)
尝试不成功后,我通过以下方法解决了问题:
我创建了一个加载视图:
class LoadBoardView : View() {
class Scope(val source: <Your source type>, var loaded: <Your loaded type>)
: tornadofx.Scope()
override val scope = super.scope as Scope
override fun onDock() {
super.onDock()
runAsync {
// Do the loading into scope.loaded
} ui {
close()
}
}
}
此视图在显示后立即开始加载,并在完成后自行关闭。
在我的向导页面中,我只使用了阻止执行:
override fun onSave() {
val loaderScope = LoadBoardView.Scope(<your id to load>)
find<LoadBoardView>(loaderScope).apply {
openModal( block = true)
}
// Get loaded value from loaderScope.loaded
super.onSave()
}