我的外部方法中有一个局部变量,我想从匿名内部类更改。我该怎么做?
我使用描述here
的单元素数组尝试了解决方案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
}
}
并使用持有者描述here
的解决方案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类。
答案 0 :(得分:3)
您正在创建一个Runnable类,但它实际上从未运行过。你需要&#34;开始&#34;它,通过调用它的start()方法。
但是你还必须记住,当你在outerMethod()中启动它时,它可能不会在调用Log方法之前运行(因为它将在一个单独的线程中运行)以及代码的顺序被叫不再保证。
答案 1 :(得分:0)
检查线程的同步。使用Object.wait()或synchronized关键字。您的主线程不会等到新创建的线程初始化变量。它应该等待这个结束。
顺便说一句,你的班级不能成为内心阶级。见here