在 static 內部類(如 Runnable)中直接用 Toast.makeText(CONTEXT, ...) 會報錯,因為靜態類無法訪問外部類的 this 引用。解決鍵在於獲取有效的 Context,推薦使用 Application Context。
private static class UpdateRunnable implements Runnable {
public void run() {
// ❌ CONTEXT 未定義,this 指向 Runnable 實例而非 Activity
Toast.makeText(CONTEXT, "msg", Toast.LENGTH_LONG).show();
}
}
public class MainActivity extends Activity {
// 非靜態方法,可用 getApplicationContext()
public void showToast(String msg) {
Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
}
private static class UpdateRunnable implements Runnable {
private WeakReference<MainActivity> activityRef;
public UpdateRunnable(MainActivity activity) {
this.activityRef = new WeakReference<>(activity);
}
public void run() {
MainActivity activity = activityRef.get();
if (activity != null) {
activity.showToast("Toast message"); // 通過弱引用調用
}
}
}
}
private static class UpdateRunnable implements Runnable {
private Context context;
public UpdateRunnable(Context context) {
this.context = context.getApplicationContext(); // 持有 Application Context
}
public void run() {
Toast.makeText(context, "msg", Toast.LENGTH_SHORT).show();
}
}
// 調用處:new UpdateRunnable(MainActivity.this)
Application Context(getApplicationContext()),生命周期最長,安全。Handler 切換。掌握 Context 傳遞規則,靜態類也能安全彈 Toast。