[英]How to change outer variable from anonymous inner class?
我在我的外部方法中有一個局部變量,我想從一個匿名內部類更改。 我該怎么做?
我使用這里描述的單元素數組嘗試了解決方案
public class outerClass{
static public void outerMethod(Interface interface) {
final String[] variable = new String[1];
new Thread(new Runnable() {
@Override
public void run() {
variable[0] = "Hello";
Log.i("test", variable[0]); // Works, prints "Hello"
}
}).start();
Log.i("test", variable[0]); // Doesn't work, null string
}
}
以及使用此處描述的支架的解決方案
public class outerClass{
static public void outerMethod(Interface interface) {
final Holder<String> variable = new Holder<String>;
new Thread(new Runnable() {
@Override
public void run() {
variable.held = "Hello";
Log.i("test", variable.held); // Works, prints "Hello"
}
}).start();
Log.i("test", variable.held); // Doesn't work, null string
}
}
class Holder<String> {
public String held;
}
但由於某些原因,兩者都不適用於我的情況。
它可能是相關的,但不同的是我的外部方法是靜態的。 我還在這里簡化了我的代碼,原始代碼是來自Android上的Retrofit庫的匿名Callback類。
您正在創建一個Runnable類,但實際上它從未運行過。 你需要通過調用它的start()方法來“啟動”它。
但是你還必須記住,當你在outerMethod()中啟動它時,它可能不會在調用Log方法之前運行(因為它將在一個單獨的線程中運行)並且調用代碼的順序不是保證了。
檢查線程的同步。 使用Object.wait()或synchronized關鍵字。 您的主線程不會等到新創建的線程初始化變量。 它應該等待這個完成。
順便說一句,你的班級不能成為內心階級。 看到這里
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.