Как я могу передать переменную во внутренний класс потока? - PullRequest
3 голосов
/ 06 февраля 2011

Я хочу загружать изображение с периодическими интервалами в элемент изображения.Мой внешний класс генерирует 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 моему классу внутренней темы?

Ответы [ 4 ]

5 голосов
/ 06 февраля 2011

Вы должны объявить переменную 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 голос
/ 06 февраля 2011

Должно работать, если ваш URL содержится в окончательной ссылке. Это означает, что ссылка не будет двигаться. Следовательно, вы не можете инициализировать его как null, а затем вызвать getURL, вам нужно объявить его в этой точке:

final String URL = getURL(serverquery);
0 голосов
/ 08 декабря 2011

Просто сделайте поле статической переменной, принадлежащей классу, а не каким-либо экземпляром объекта класса, например:

public YourClass {

    private static String url;

    //...
}

Обратите внимание, однако, что статическая переменная будет общей для всех экземпляров объекта класса.

0 голосов
/ 06 февраля 2011

Я обнаружил, что есть (по крайней мере) 2 основных способа сделать это, когда ваш поток получает информацию или получает информацию (в вашем случае URL)

1) получает информацию:

что вы хотите сделать, это сохранить ссылку на объект, содержащий необходимые данные (например, URL) в вашей ветке, и когда вы будете готовы, поток получит следующий элемент / 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
       }

таким образом, ваш поток получает с помощью установщика данные, необходимые для его работы, обрабатывает его, а затем ожидает, когда ему будут отправлены следующие данные (конечно, вам нужно быть осторожным с такими проблемами потока, как множественные вызовы и т. Д.)

Надеюсь, это поможет вам

Jason

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...