我想定期将图像加载到图像项目。我的外部类正在生成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类?
答案 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;
//...
}
但请注意,静态变量将在类的所有对象实例之间共享。