[英]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.