TornadoFx FXTask OutOfMemoryError - PullRequest
       10

TornadoFx FXTask OutOfMemoryError

0 голосов
/ 23 сентября 2019

Итак, у меня есть интересный кусок кода, и я сталкиваюсь с ошибкой OutOfMemoryError.

Так что моя проблема в том, что я создаю внутри своего searchThread новые темы, которые ищут снова.Это, очевидно, создает OutOfMemoryError, но я хотел использовать код TornadoFX только для решения этой проблемы без всякой удачи.

searchThread = runAsync {
    while (!searchThread.isCancelled) {
            runAsync {
                // Searching for Sth
            } ui {
                // Updating UI 
            }
        }
    }
}

Как я могу получить, если runAsync внутри моей поисковой цепочки все еще работает, поэтому я могу пропустить созданиеновой темы?

Ответы [ 2 ]

2 голосов
/ 23 сентября 2019

Что вы делаете, когда создаете новые задачи в тесном цикле, так что, очевидно, вам не хватит памяти.Вызов для вложенного runAsync не будет ждать, просто выполните еще раз, пока условие не станет ложным.

Удалите внутренний runAsync и просто делайте все, что вы хотите сделать, затем вызовите runLater, если хотитеобновить что-то в потоке пользовательского интерфейса.

0 голосов
/ 26 сентября 2019

Мне кажется, я понимаю вашу проблему.Ваша цель - иметь только одну поисковую цепочку, которая не будет вызвана, если она уже запущена.Как сказал Эдвин, зацикливание вызова асинхронных потоков действительно очень плохо.Не говоря уже о том, что вложенные потоки могут даже не иметь условия уничтожения.Это было бы простым решением, но разве это не имело бы больше смысла?

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 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
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...