在已发布的 Runnable 中引用时,变量分配在哪里?

Where are variables allocated when referenced within posted Runnables?

我的理解(尽管可能不正确!)是在 Method1() 中,myInt 将分配在堆栈上,然后在从方法返回时释放。

我的问题是 myInt 将在 Method2() 中分配的位置,因为该方法可以在 [=16= 之前从(因此 myInt 从堆栈中释放)返回] 发布到UI线程的Looper被执行?然而,在测试中,Runnable 似乎仍然能够引用 myInt。编译器是否会自动将 posted Runnables 中引用的变量移动到堆中,即使它们通常会在堆栈上分配?

public void Method1()
{
    int myInt = 0;

    /* Do some operations on myInt */
    myInt = 5;
}

public void Method2()
{
    int myInt = 0;

    RunOnUiThread(() =>
    {
        /* Do some operations on myInt within a Runnable posted to the UI thread's Looper */
        myInt = 5;
    });
}

方法 2 创建 Closure。作为 实现细节 (即:语言设计者可以自由更改它),编译器通过在捕获值现在所在的场景后面创建 class 来使闭包工作成员 属性,对值的访问现在被重写为对 class.

实例中 属性 的访问

换句话说,现在在堆上分配了一个 class 实例来保存这个值。

同样,这是一个实现细节。有可能(虽然不太可能)未来的修订可能会做一些事情,比如分配一个额外的堆栈帧而不是 class 实例。