Spec-Zone .ru
спецификации, руководства, описания, API
|
Содержание
У апплетов есть сложная среда выполнения, и несколько проблем, как должны полагать, гарантируют что апплеты, выполненные очевидно на различных браузерах и версиях Плагинов Java. Этот документ описывает лучшие методы для разработки апплета и развертывания.
Значения, сохраненные в апплете, могли сохраниться между вызовами, если память, полученная кэшем загрузчика класса, не необходима в других целях. Но невозможно зависеть от того поведения. Вообще, апплеты должны быть не сохраняющими состояние. Если персистентное хранение необходимо, используйте cookie браузера.
start
метод как можно быстрееЕсли start
не завершается, stop
не может быть вызван. Это важно, потому что сборка "мусора" происходит после destroy
метод завершается. Если апплет задерживается в start
метод, тогда апплет не может быть разъединен должным образом. (Это будет разъединено, и сборка "мусора" произойдет, но средства, полученные во время инициализации апплета, не могут быть должным образом высвобождены.)
Для в вычислительном отношении интенсивного приложения как Runnable
соедините интерфейсом, прикончите тяжелый подъем run
метод это требует, и запустите отдельный поток, чтобы сделать фактическую работу, как показано в этом кратком обзоре из
public class Clock extends Applet implements Runnable { private volatile Thread timer; // The thread that displays the clock ... public void start() { timer = new Thread(this); // Create the thread and start it timer.start(); } public void stop() { timer = null; // Release the thread resource } public void run() { Thread me = Thread.currentThread(); while (timer == me) { try { Thread.currentThread().sleep(100); } catch (InterruptedException e) { } repaint(); } } ...
Здесь, действие должно приостановить экземпляр Часов, который это выполняет в новом потоке (следовательно потребность сохранить указатель на это.) Апплеты, которые не должны сделать всего, что может просто поместить их код обработки в run
метод.
Для интерактивного приложения как
public class SpreadSheet extends Applet implements MouseListener, KeyListener // Event processing { public void init() { ... addMouseListener(this); addKeyListener(this); } ... public void start() { isStopped = false; } public void stop() { isStopped = true; } public void keyTyped(KeyEvent e) { // Invoked when an event occurs ... } public void mousePressed(MouseEvent e) { ... } ... class CellUpdater extends Thread { ... public void run() { ... if (!target.app.isStopped && !target.paused) { target.app.repaint(); }
В этой определенной реализации у каждой ячейки есть свой собственный поток обновления. Обновление приостанавливается, когда ячейка выбирается, и только останавливается полностью, когда апплет завершается. Важный момент то, что апплет start
и методы stop только отслеживают состояние апплета. Большая часть времени проводится в базовом потоке обработки событий, ожидающем нажатия клавиши пользователя или щелчка мышью. Реальная работа апплета тогда происходит в ответ на одно из тех событий.
ID определяет пространство имен, и гарантирует надлежащее именование на всех уровнях иерархии данных:
<applet id="myApplet" name="myApplet" ...
Апплеты действительно не сохраняющие состояние не зависят от значений, ранее сохраненных в статических переменных. Так как невозможно зависеть от тех значений, которые будут сохранены, это - хорошая идея создать апплеты не сохраняющие состояние. Но пользователь может все еще сохранить состояние. Это только, которые хранят данные, где это принадлежит - с пользователем, а не в коде апплета.
Чтобы реализовать приложение не сохраняющее состояние, cookie браузера доступа или запуск с JNLP, чтобы использовать Java веб-сдобы Запуска, таким образом, апплет добирается, это - начальные установки от персистентного хранения, вместо того, чтобы использовать значения, сохраненные в программе.
Чтобы гарантировать, что Ваш апплет является не сохраняющим состояние, используйте атрибут classloader_cache, чтобы отключить кэш. Например:
<applet ... classloader_cache="false"
Та установка гарантирует, что апплет является не сохраняющим состояние, и что это действительно разъединяется от остатка от системы и от других экземпляров апплета. Это также гарантирует, что апплет выполняет тот же самый путь каждый раз, так как на это не будет влиять состояние, которое было непреднамеренно сохранено.
Отметьте:
В редком случае, что Вы ожидаете, что Ваши пользователи неоднократно запустят повторно тот же самый апплет, Вы могли бы считать отъезд кэша включенным для производства ради производительности, но отключить его во время разработки, чтобы гарантировать качество.
Чтобы предотвратить конкуренцию потока, не обновляйте Swing или GUI AWT от javascript непосредственно. Вместо этого установите прокси, который передает запрос к соответствующему, диспетчеризируют поток:
javax.swing.SwingUtilities.invokeLater(Runnable)
java.awt.EventQueue.invokeLater(Runnable)
Минимизируйте время, потраченное, чтобы вызвать от Java в javascript, и от javascript в Java. Не делайте продолжительной работы в таких вызовах, или Вы рискуете мертвой блокировкой. Сохранить вызовы короткими:
Вызывая в Java, не превращайте, перезванивает в javascript, если можно возможно помочь этому, и наоборот. В том исходном плагине, делая столь имел обыкновение запирать браузер. Это не должно произойти больше, но вызовы туда и обратно действительно представляют существенные задержки во время обработки.
Когда функция javascript нуждается в апплете, чтобы сделать что-то, передовая практика должна возвратить значение, которое говорит апплету делать это, и затем перезванивать с результатами, или иначе использованием invokeLater
минимизировать связь трафика ups.
У платформы Java есть мощные возможности многопоточности, которые можно использовать в своих интересах с классами как Поток, Swing invokeLater
, и AWT invokeLater
, так же как новый класс ThreadPoolExecutor, который поддерживает пул фонового потока.