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

Which option should I use to pass the context to a custom Runnable inside MainActivity?

选项是:使用 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

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

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