2010-08-29 2 views
3

J'ai un code Java de longue durée s'exécutant dans un thread démarré par une applet Java. Dès que le code est terminé, il contient des informations pour l'utilisateur. J'aimerais transmettre ces informations à un rappel JavaScript de manière thread-safe. Le simple fait d'utiliser l'API Java DOM pour modifier le document HTML n'est pas suffisant, à moins que mon rappel JavaScript ne soit appelé en tant qu'effet secondaire dans un thread sécurisé (c'est-à-dire dans le même thread de navigateur où les callbacks JavaScript s'exécutent). Comment puis-je l'implémenter? Y a-t-il des bibliothèques qui le font déjà?Comment appeler un rappel JavaScript à partir d'un thread d'applet Java?

Répondre

0

Il semble qu'il n'y ait pas de tutoriel public sur la façon de le faire. L'ensemble de l'interface JavaScript - Java est sous-documenté et il est soumis à des limitations du navigateur.

+1

Mais jetez un oeil ici: https://jdk6.java.net/plugin2/liveconnect/ – flup

2

On dirait que l'API DOM commune est ce dont vous avez besoin. En substance, vous demandez à un DOMService de vous rappeler sur le thread principal de l'interface utilisateur lorsqu'il est bon et prêt.

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

Comme je comprends les choses, JSObject est la "ancienne" et l'API DOM Common est la façon plus récente (en Java 6). Ce que vous devez faire est d'appeler une méthode de votre applet et passer l'objet de la fonction que vous voulez rappeler. Votre applet appelle ensuite cet objet de fonction depuis votre DOMAction.

Je n'ai pas de code à portée de main pour vous montrer et ce n'est pas quelque chose que j'ai fait avant d'utiliser Java. Cependant, j'ai utilisé une technique similaire avec un plugin web NPAPI écrit en C++, c'est-à-dire que JS appelait mon objet C++ en passant une fonction en paramètre, et que l'objet C++ appelait la fonction JS à un stade ultérieur. "J'espère que cela aide.

+0

Bien sûr, mais que dois-je écrire à mon dans ma 'DOMAccessor.run'? Dois-je essayer d'obtenir une référence à un 'JSObject', et essayer d'invoquer un callback à partir de là? Ou devrais-je essayer de modifier le DOM, et j'espère que JavaScript peut le détecter (par exemple DOMAttrModified) - mais cela n'est pris en charge que dans la minorité des navigateurs, et non pris en charge dans Internet Explorer. Pourriez-vous donner un exemple de code croisé qui fonctionne? – pts

1

J'ai eu des problèmes de concurrence avec plusieurs threads applet appelant Javascript. Certains des appels ont simplement été ignorés par Internet Explorer 8 (Firefox 3.6 et Safari 5 ont bien fonctionné).

J'ai essayé d'emballer les appels à Javascript avec DOMService.invokeAndWait - cela n'a pas aidé. J'ai fini par m'assurer que tous les appels Java-> Javascript sont faits à partir du même thread, et mes problèmes ont été résolus (au moins temporairement - je n'ai pas vérifié ce qui se passe si le thread Javascript est occupé par certains utilisateurs ...). travail initié).

Pour sérialiser les appels, je Executors.newSingleThreadExecutor

Questions connexes