3 Stimmen

Wie kann ich eine Variable an eine innere Thread-Klasse übergeben?

Ich möchte ein Bild in regelmäßigen Abständen in ein Imageitem laden. Meine äußere Klasse generiert die URL und ich muss sie an die innere Klasse weitergeben. Wie kann ich das erreichen?

public class MapTimer extends TimerTask{
    public void run() {
        System.out.println("Map starting...");

        String URL=null,serverquery=null;
        try {
            sendMessage(this.message);
            item.setLabel(item.getLabel()+"start");
            serverquery=receiveMessage();
            item.setLabel(item.getLabel()+"stop");
            URL = getURL(serverquery);               // my url to be passed to innerclass
            System.out.println("URl is "+serverquery);
            item.setLabel(URL+item.getLabel());
            Thread t = new Thread() {
            public void run() {
                    item.setLabel(item.getLabel()+"6");
                    try {
                          Image image = loadImage(URL);            // using url
                          System.out.println("GEtting image....");
                          item = new ImageItem(null, image, 0, null);
                          form.append(item);
                          display.setCurrent(form);

                    } catch (IOException ioe) {
                          item.setLabel("Error1");
                    }
                    catch (Exception ioe) {
                          item.setLabel("Error1");
                    }
              }
         };
         t.start(); // write post-action user code here
     }
     catch(Exception e){
         System.out.println("Error3"+e);
     }
  }    
}

Wie übergebe ich die URL an meine Innerthread-Klasse?

5voto

RoflcoptrException Punkte 50975

Sie müssen die Variable als final deklarieren oder keine Variable, sondern ein Feld in der Klasse verwenden.

public class YourClass {

private String url;

public void yourMethod {
   url = getURL(serverquery);
   System.out.println("URl is "+serverquery);
   item.setLabel(URL+item.getLabel());
   Thread t = new Thread() {
      public void run() {
         item.setLabel(item.getLabel()+"6");
         try {
           Image image = loadImage(url);            // using url
           System.out.println("GEtting image....");
           item = new ImageItem(null, image, 0, null);
           form.append(item);
           display.setCurrent(form);

    } catch (IOException ioe) {
      item.setLabel("Error1");
    }
                catch (Exception ioe) {
      item.setLabel("Error1");
    }

  }
};
t.start(); // write post-action user code here
}

}

1voto

jopasserat Punkte 5524

Es sollte funktionieren, wenn Ihre URL in einem endgültigen Verweis enthalten ist. Das bedeutet, dass der Verweis nicht verschoben wird. Folglich können Sie sie nicht auf null initialisieren und dann getURL aufrufen, Sie müssen sie an dieser Stelle deklarieren:

final String URL = getURL(serverquery);

0voto

Jason Rogers Punkte 18940

Ich habe herausgefunden, dass es (mindestens) 2 Möglichkeiten gibt, dies zu tun, je nachdem, ob Ihr Thread die Informationen erhält oder die Informationen erhält (in Ihrem Fall die URL)

1) erhält die Informationen:

was Sie tun möchten, ist halten einen Verweis auf das Objekt mit den Daten, die Sie benötigen (wie URL) in Ihrem Thread, und wenn Sie bereit sind, der Thread erhält das nächste Element/URL zu laden.

public class MapTimer extends TimerTask{
   public void run() {
     ...
   }
   private URLGenerator urlGenerator = null;
   public MapTimer(URLGenerator urlGen){
      ...
   }

Dies gibt Ihnen die Möglichkeit, die nächste URL zu erhalten, wenn Ihr Thread frei ist (natürlich mit einem if(urlGen != null))

2) Empfängt Informationen

Funktioniert besser in Fällen, in denen der Thread nur dann aufgerufen wird, wenn der Rest des Programms dies wünscht (Eingabe von Daten durch den Benutzer usw.)

public class MapTimer extends TimerTask{
       public void run() {
         ...
       }
       private URL urlToLoad = null;
       public void setURL(URL urlToLoad){
          ...
          //store and wake up thread
       }

Auf diese Weise empfängt Ihr Thread mit einem Setter die Daten, die er zur Ausführung benötigt, verarbeitet sie und wartet dann auf die nächsten Daten, die ihm gesendet werden (natürlich müssen Sie auf Thread-Probleme wie Mehrfachaufrufe usw. achten).

Ich hoffe, dies hilft Ihnen

Jason

0voto

kidhuvig Punkte 134

Machen Sie das Feld einfach zu einer statischen Variablen, die zur Klasse gehört und nicht zu einer Objektinstanz der Klasse, etwa so:

public YourClass {

    private static String url;

    //...
}

Bitte beachten Sie jedoch, dass die statische Variable von allen Objektinstanzen der Klasse gemeinsam genutzt wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X