[英]How can I pass a variable to an inner thread class?
我想定期将图像加载到图像项目。 我的外部类正在生成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类?
您必须声明变量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
}
}
如果您的URL包含在最终引用中,它应该可以工作。 这意味着引用不会移动。 因此,您无法将其初始化为null然后调用getURL,您需要在此时声明它:
final String URL = getURL(serverquery);
我发现,当您的线程获取信息或收到信息时,(至少)有两种主要方法可以执行此操作(在您的案例中为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
}
这样你的线程就会通过setter接收它需要运行的数据,处理它然后等待下一个数据发送给它(当然你需要注意线程问题,如多次调用等)
希望这对你有所帮助
贾森
只需将该字段设为属于该类的静态变量,而不是该类的任何对象实例,如下所示:
public YourClass {
private static String url;
//...
}
但请注意,静态变量将在类的所有对象实例之间共享。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.