我应该使用哪个选项将上下文传递给 MainActivity 内的自定义 Runnable?

问题描述

选项是:使用 MainActivity.this 或通过 Runnable 构造函数传递上下文。

一个选项:

public class MainActivity extends AppCompatActivity {
    //...
    public void onButtonClick() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                SomeMethod(MainActivity.this);
            }
        }).start();
    }
    //...
}

第二个选项:

public class MainActivity extends AppCompatActivity {
    //...
    public void onButtonClick() {
        new Thread(new SomeRunnable(this)).start();
    }
    //...
    private class SomeRunnable implements Runnable {
        private final Context context;

        public SomeRunnable(Context context) {
            this.context = context;
        }

        @Override
        public void run() {
            SomeMethod(context);
        }
    }
}

一个选项似乎更方便一些(因为它更短),但是这样的代码会不会有任何行为问题?

解决方法

更好的方法是:

public class MainActivity extends AppCompatActivity {
    //...
    public void onButtonClick() {
        new Thread(() -> SomeMethod(this)).start();
    }
    //...
}

说明:lambda 表达式属于当前方法的作用域,因此可以直接访问this

,

最好将上下文保持在自己的范围内。因此,如果您需要 context 之外的 Activity,您可以使用 getApplicationContext()

更复杂的定义在这里:What's the difference between the various methods to get a Context?