【问题标题】:How to change outer variable from anonymous inner class?如何从匿名内部类更改外部变量?
【发布时间】:2016-02-06 00:16:33
【问题描述】:

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

我尝试了使用 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 库中的匿名回调类。

【问题讨论】:

  • 您是否正在创建并启动Thread 来运行您的Runnable

标签: java anonymous-class


【解决方案1】:

您正在创建一个 Runnable 类,但它实际上从未运行过。您需要通过调用它的 start() 方法来“启动”它。

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

【讨论】:

  • 这不是我的实际代码,我已经简化了它,所以我忘了开始。如果一切看起来都很好,你想让我代替实际的代码吗?
  • 我已经编辑了我的答案,以获取有关后续代码执行的线程和顺序的更多评论。
  • 非常感谢,这确实是问题所在!日志在线程修改变量之前运行。我在线程中添加了一个 join() 以等待它完成打印日志,现在它就像一个魅力!
【解决方案2】:

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

顺便说一句,你的班级不可能是内部班级。见here

【讨论】:

    猜你喜欢
    • 2019-02-04
    • 2018-10-29
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多