2011-02-06 7 views
3

イメージアイテムに定期的な間隔でイメージをロードします。私の外部クラスはURLを生成しており、それを内部クラスに渡す必要があります。これをどのように達成するのですか?変数を内部スレッドクラスに渡すにはどうしたらいいですか?

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); 
    } 
    }  
} 

私のインナースレッドクラスにURLを渡すにはどうすればよいですか?

答えて

5

変数finalを宣言するか、変数を使用せずにクラス内のフィールドを使用する必要があります。

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 
} 

}

1

あなたのURLは、最終的な参照に含まれている場合、それは動作するはずです。これは、参照が移動しないことを意味します。そのため、あなたはヌル、その後のgetURLを呼び出すためにそれを初期化することはできません、あなたはこの時点でそれを宣言する必要があります:

0

私は(少なくとも)は、あなたのスレッドwheverこれを上行うための2つの主要な方法があることがわかりました(あなたのケースのURLに)情報を取得または情報をrecieves

1)の情報を取得します。

何がやりたいことはあなたに)URLのように(あなたが必要とするデータを含むオブジェクトの参照を保持されますあなたの準備ができたら、スレッドはロードする次のアイテム/ URLを取得します。あなたのスレッドは

2)受信した情報

作品より良い((urlGenもちろん!= nullが)場合に)自由であるとき

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

これは、あなたの次のURLを取得するためのオプションを提供しますプログラムの残りの部分は、(ユーザー入力環境データなど)に望んでいるときにのみスレッドが呼び出された場合のために

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

このようセッターを使用してスレッドレシーブそれが実行に必要なデータ、プロセスそれはその後、(あなたが複数の呼び出しなどのようなスレッドの問題に注意する必要があるのコース)、それに送信される次のデータを待ちES

希望これはちょうど作るあなた

ジェイソン

0

を支援フィールドこのような静的なクラスに属する変数ではなく、クラスの任意のオブジェクトインスタンス、:

public YourClass { 

    private static String url; 

    //... 
} 

は、静的変数は、クラスのすべてのオブジェクトインスタンス間で共有されることが注意してください。

関連する問題