非靜態內部類別 MyCustomTask extends AsyncTask 隱含持有外部類別實例參考。若在靜態上下文(如 static 方法)建立實例,會拋出 No enclosing instance。
public class MyActivity extends AppCompatActivity {
// 靜態內部類別,不持有外部實例參考
private static class MyCustomTask extends AsyncTask<Void, Void, Long> {
private final WeakReference<Context> contextRef; // 弱參考防洩漏
MyCustomTask(Context context) {
this.contextRef = new WeakReference<>(context);
}
@Override
protected Long doInBackground(Void... params) {
// 背景工作
return 0L;
}
@Override
protected void onPostExecute(Long result) {
Context context = contextRef.get();
if (context != null) {
Toast.makeText(context, "完成", Toast.LENGTH_LONG).show();
}
}
}
// 使用
new MyCustomTask(this).execute();
}
// MyCustomTask.java
public class MyCustomTask extends AsyncTask<Void, Void, Long> {
private final WeakReference<Context> contextRef;
public MyCustomTask(Context context) { this.contextRef = new WeakReference<>(context); }
// ... 同上
}
// Coroutine 在 Activity/ViewModel 中
lifecycleScope.launch(Dispatchers.IO) {
val result = repository.fetchData()
withContext(Dispatchers.Main) {
toast("完成")
uiState.value = result
}
}
WeakReference 避免記憶體洩漏(Activity 銷毀時可被 GC 回收)。