问题描述
选项是:使用 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?