2015-03-25 2 views
0

У меня есть приложение JavaFX, которое загружает мое собственное приложение HTML/JS в WebView. В зависимости от события мне нужно вызвать Javascript с Java и Java из Javascript.JavaFX + WebView/Javascript: setTimeOut не работает стек вызовов приходит из Java

Каждый из них хорош при переходе от JS к Java, но у меня странное поведение при переходе с Java на Javascript.

  • Вот, в принципе, как мне установить связь между 2-х языках:

_

var javaObjectInjected = typeof javaObject !== "undefined"; 

if(javaObjectInjected && !javaObjectInitialized) { 
    jThalesEventBusInitialized = true; 

    const jsAdapter = { 
     publishToJs: onPublishToJs 
    }; 

    javaObject.setJsAdapter(jsAdapter); 
} 
  • Мой Java код будет вызывать метод publishToJs на поставленном jsAdapter. Это приведет к выполнению onPublishToJs.

_

function onPublishToJs(topic, data) { 
    alert('Yeah! We are inside JS'); //output_1 

    setTimeout(
     function() { 
      alert('inside setTimeOut'); //output_2 
     }, 
     1000 
    ); 
} 

я получить OUTPUT_1 но не output_2. Это похоже на обратный вызов setTimeOut, который был отброшен.

Существуют ли какие-либо известные ограничения при вызове JS из Java?

+0

Это довольно угадайте - попробуйте что-то другое, кроме 'alert' в обратном вызове' setTimeout', например, записывая что-то на консоль. – dave

+0

Выходы консоли JS не перенаправляются на консоль Java, поэтому я добавил FireBug Lite 1.2 в раздел моего HTML. В обратном вызове setTimeOut я заменил alert ('...') на console.log ('...') и ничего не изменил. Еще нет выхода_2! – Pigelvy

ответ

0

Я переработан мой код и вместо того, чтобы впрыскивать jsAdapter в мире Java с использованием javaObject.setJsAdapter(jsAdapter), я выставил jsAdapter на Java в качестве нового члена window.

С этой новой структурой кода у меня есть исключения при вызове jsAdapter с Java, потому что я делал это с EDT вместо JavaFX Application Thread.

В конце концов, я завернул jsAdapter звонки в Platform.runLater(() -> ...) и все.

При работе с Javascript, загружаемым из JavaFX WebView, обязательно выполняйте Javascript-вызовы из JavaFX Application Thread.