簡體   English   中英

如何從匿名內部類更改外部變量?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM