如何从匿名内部类更改外部变量?

时间:2016-02-06 00:16:34

标签: java anonymous-class

我的外部方法中有一个局部变量,我想从匿名内部类更改。我该怎么做?

我使用描述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类。

2 个答案:

答案 0 :(得分:3)

您正在创建一个Runnable类,但它实际上从未运行过。你需要&#34;开始&#34;它,通过调用它的start()方法。

但是你还必须记住,当你在outerMethod()中启动它时,它可能不会在调用Log方法之前运行(因为它将在一个单独的线程中运行)以及代码的顺序被叫不再保证。

答案 1 :(得分:0)

检查线程的同步。使用Object.wait()或synchronized关键字。您的主线程不会等到新创建的线程初始化变量。它应该等待这个结束。

顺便说一句,你的班级不能成为内心阶级。见here