如何将变量传递给内部线程类?

时间:2011-02-06 12:59:32

标签: java image

我想定期将图像加载到图像项目。我的外部类正在生成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传递给我的innerthread类?

4 个答案:

答案 0 :(得分: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 :(得分:1)

如果您的网址包含在最终参考中,它应该有用。这意味着引用不会移动。因此,您无法将其初始化为null然后调用getURL,您需要在此时声明它:

final String URL = getURL(serverquery);

答案 2 :(得分:0)

我发现,当您的线程获取信息或收到信息时,(至少)有两种主要方法可以执行此操作(在您的案例中为URL)

1)获取信息:

你想要做的是在你的线程中保留包含你需要的数据的对象的引用(比如URL),当你准备就绪时,Thread会得到下一个要加载的项目/ URL。

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

这将为您提供在线程空闲时获取下一个URL的选项(当然使用if(urlGen!= null))

2)收到信息

只有当程序的其余部分想要(用户输入数据等)时调用线程的情况才能更好地工作

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

这样你的线程就可以通过setter接收它需要运行的数据,然后处理它然后等待下一个数据发送给它(当然你需要注意线程问题,比如多次调用等)。 p>

希望这有助于你

杰森

答案 3 :(得分:0)

只需将该字段设为属于该类的静态变量,而不是该类的任何对象实例,如下所示:

public YourClass {

    private static String url;

    //...
}

但请注意,静态变量将在类的所有对象实例之间共享。