Как вызвать обратный вызов JavaScript из потока Java-апплета? - PullRequest
3 голосов
/ 30 августа 2010

У меня есть некоторый долго работающий код Java, запущенный в потоке, запущенном апплетом Java.Как только код закончен, у него есть информация для пользователя.Я хотел бы передать эту информацию в обратный вызов JavaScript потокобезопасным способом.Просто использовать API Java DOM для изменения HTML-документа недостаточно, если только мой обратный вызов JavaScript не вызывается как побочный эффект потокобезопасным способом (т.е. в конечном итоге в том же потоке браузера, где выполняются обратные вызовы JavaScript).Как я могу это реализовать?Библиотеки уже делают это?

Ответы [ 3 ]

2 голосов
/ 30 августа 2010

Похоже, вам нужен Common DOM API. По сути, вы просите DOMService перезвонить вам в главном потоке пользовательского интерфейса, когда он исправен и готов.

http://docs.oracle.com/javase/1.5.0/docs/guide/plugin/developer_guide/java_js.html

Как я понимаю, JSObject - это «старый путь», а Common DOM API - более новый способ (начиная с Java 6). Вам нужно вызвать метод вашего апплета и передать объект функции, который вы хотите вызвать. Затем ваш апплет вызывает этот функциональный объект из вашего DOMAction.

У меня нет кода, чтобы показать вам, и это не то, что я делал до использования Java. Однако я использовал аналогичную технику с веб-плагином NPAPI, написанным на C ++, то есть если бы JS вызывал мой объект C ++, передавая функцию в качестве параметра, а затем на более позднем этапе, чтобы объект C ++ вызывал функцию JS. Надеюсь, что это поможет.

1 голос
/ 15 декабря 2010

У меня были проблемы параллелизма с несколькими потоками апплета, вызывающими Javascript. Internet Explorer 8 просто игнорировал некоторые вызовы (Firefox 3.6 и Safari 5 работали нормально).

Я пытался обернуть вызовы Javascript с помощью DOMService.invokeAndWait - это не помогло.

Я закончил тем, что все вызовы Java-> Javascript были сделаны из одного и того же потока, и мои проблемы были решены (по крайней мере, временно - я не проверял, что происходит, если поток Javascript занят каким-либо пользователем) работа).

Для сериализации вызовов я использовал Executors.newSingleThreadExecutor

0 голосов
/ 13 ноября 2010

Кажется, что нет публичного руководства, как это сделать. Весь интерфейс JavaScript - Java недокументирован и подвержен ограничениям браузера.

...