Kotlin TornadFX FXTask OutOfMemoryError
所以我有一段有趣的代码,我遇到了OutOfMemory错误 所以我的问题是,我在我的searchThread中创建了新的线程,这些线程正在再次搜索。这显然造成了OutOfMemoryError,但我想使用TornadoFX代码只是为了解决这个问题,没有任何运气Kotlin TornadFX FXTask OutOfMemoryError,kotlin,tornadofx,Kotlin,Tornadofx,所以我有一段有趣的代码,我遇到了OutOfMemory错误 所以我的问题是,我在我的searchThread中创建了新的线程,这些线程正在再次搜索。这显然造成了OutOfMemoryError,但我想使用TornadoFX代码只是为了解决这个问题,没有任何运气 searchThread = runAsync { while (!searchThread.isCancelled) { runAsync { // Searching f
searchThread = runAsync {
while (!searchThread.isCancelled) {
runAsync {
// Searching for Sth
} ui {
// Updating UI
}
}
}
}
如果我的搜索线程中的runAsync仍在运行,那么我如何获取它,以便跳过创建新线程?你正在做的是在一个紧密的循环中创建新任务,因此显然你会耗尽内存。对嵌套的
runAsync
的调用不会等待,只需再次执行,直到条件为false为止
删除内部的
runAsync
,然后做任何你想做的事情,然后调用runLater
,如果你想更新UI线程上的内容。你正在做的是在一个紧密的循环中创建新任务,因此显然你会耗尽内存。对嵌套的runAsync
的调用不会等待,只需再次执行,直到条件为false为止
删除内部的
runAsync
,然后做任何你想做的事情,然后调用runLater
,如果你想更新UI线程上的内容。我想我理解你的问题。您的目标是只有一个搜索线程在运行时不会被调用。正如Edvin所说,循环调用异步线程是非常糟糕的。更不用说,嵌套线程甚至可能没有终止条件。这将是一个简单的解决方案,但这不是更有意义吗
val searchTask: Task<YourReturnType>? = null
private fun search() {
if(searchTask?.isRunning != true) {
searchTask = runAsync {
//Do your search thread things
} ui { result ->
//do things with your UI based on your result
}
}
}
val搜索任务:任务?=无效的
私人趣味搜索(){
if(searchTask?.isRunning!=真){
searchTask=runAsync{
//做你的搜索线程的事情
}ui{result->
//根据结果对UI进行操作
}
}
}
类似地,如果您想用新的搜索线程替换旧的正在运行的搜索线程,可以尝试以下操作:
val searchTask: Task<YourReturnType>? = null
private fun search() {
if(searchTask?.isRunning == true) {
searchTask?.cancel()
//You should probably do something to check if the cancel succeeded.
}
searchTask = runAsync {
//Do your search thread things
} ui { result ->
//do things with your UI based on your result
}
}
val搜索任务:任务?=无效的
私人趣味搜索(){
if(searchTask?.isRunning==true){
searchTask?.cancel()
//您可能应该做一些事情来检查取消是否成功。
}
searchTask=runAsync{
//做你的搜索线程的事情
}ui{result->
//根据结果对UI进行操作
}
}
我想我理解你的问题。您的目标是只有一个搜索线程在运行时不会被调用。正如Edvin所说,循环调用异步线程是非常糟糕的。更不用说,嵌套线程甚至可能没有终止条件。这将是一个简单的解决方案,但这不是更有意义吗
val searchTask: Task<YourReturnType>? = null
private fun search() {
if(searchTask?.isRunning != true) {
searchTask = runAsync {
//Do your search thread things
} ui { result ->
//do things with your UI based on your result
}
}
}
val搜索任务:任务?=无效的
私人趣味搜索(){
if(searchTask?.isRunning!=真){
searchTask=runAsync{
//做你的搜索线程的事情
}ui{result->
//根据结果对UI进行操作
}
}
}
类似地,如果您想用新的搜索线程替换旧的正在运行的搜索线程,可以尝试以下操作:
val searchTask: Task<YourReturnType>? = null
private fun search() {
if(searchTask?.isRunning == true) {
searchTask?.cancel()
//You should probably do something to check if the cancel succeeded.
}
searchTask = runAsync {
//Do your search thread things
} ui { result ->
//do things with your UI based on your result
}
}
val搜索任务:任务?=无效的
私人趣味搜索(){
if(searchTask?.isRunning==true){
searchTask?.cancel()
//您可能应该做一些事情来检查取消是否成功。
}
searchTask=runAsync{
//做你的搜索线程的事情
}ui{result->
//根据结果对UI进行操作
}
}