2010-01-25 7 views
1

J'ai un problème ici pour terminer les threads. Le problème est que j'utilise le thread d'applet pour accéder à DOM JS et manipuler innerHTML d'une étendue pour corriger le nom de thread comme innerHTML. Il fonctionne très bien jusqu'à ce que je continue à rafraîchir la page, mais si je ne donne pas un sommeil de 200ms comme et passez à une autre page qui n'avez pas une applet, il me donnera une erreur dans la console Firebug:terminaison fil d'applet java à la page de déchargement

document.getElementById("userName") is null 

Ce que je soupçonne est, bien que j'envoie une interruption sur stop et que j'aie aussi essayé en paramétrant une variable flag de running en run while loop, le thread s'exécute beaucoup plus vite que le temps que la JVM prend pour le décharger et je reçois ma page changé dans le navigateur, mais l'applet essaie toujours de trouver un élément avec id userName.

Est-ce vrai? Y a-t-il du travail? Y a-t-il un moyen de savoir combien de threads tournent en ce moment? Y a-t-il une commande kill all à envoyer sur destroy()?

J'ai beaucoup cherché, vu toute l'API des threads et applets java, ne pouvait pas faire fonctionner ça.

Voici le code:

import java.applet.Applet; 
import netscape.javascript.*; 

//No need to extend JApplet, since we don't add any components; 
//we just paint. 
public class firstApplet extends Applet { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    firstThread first; 
    boolean running = false; 

    public class firstThread extends Thread{ 
     JSObject win; 
     JSObject doc; 
     firstThread second; 

     public firstThread(JSObject window){ 
      this.win = window; 
     } 
     public void run() { 
      try{ 
       System.out.println("running... "); 

       while (!isInterrupted()){ 

        doc = (JSObject) win.getMember("document"); 
        String userName = Thread.currentThread().getName(); 
        //String userName = "John Doe"; 
        String S = "document.getElementById(\"userName\").innerHTML = \""+userName+"\";"; 
        doc.eval(S); 
        Thread.sleep(5); 
       } 
      }catch(Exception e){ 
       System.out.println("exception in first thread... "); 
       e.printStackTrace(); 
      } 
     } 
    } 

    public void init() { 
     System.out.println("initializing... "); 
    } 

    public void start() { 
     System.out.println("starting... "); 
     JSObject window = JSObject.getWindow(this); 

     first = new firstThread(window); 
     first.start(); 
     running = true; 
    } 

    public void stop() { 
     first.interrupt(); 
     first = null; 
     System.out.println("stopping... "); 
    } 

    public void destroy() { 
     if(first != null){ 
      first = null; 
     } 
     System.out.println("preparing for unloading..."); 
    } 
} 

Merci

+0

venant de votre message initial (http://stackoverflow.com/questions/2072307/loading-java- applet-on-dom-load/2072385). Je pense que votre hypothèse est correcte; le navigateur change la page plus rapidement que nécessaire pour arrêter l'applet et interrompre le thread, donc votre code essaie d'accéder à un élément qui n'existe plus. À ce stade, je suis d'accord avec la réponse de Neil Coffey. Cela devrait effacer l'erreur de la console: Chaîne S = "if (document.getElementById (\" nom_utilisateur \ ")) {document.getElementById (\" nom_utilisateur \ "). InnerHTML = \" "+ nom_utilisateur +" \ ";}"; –

Répondre

0

Tu ne peux pas simplement vérifier que document.getElementById (« nomUtilisateur ») est nul et seulement essayer de régler si ce n'est pas ... ?

Questions connexes