在 AsyncTask 的 onPostExecute 中呼叫 findViewById(R.id.list_view) 取得 ListView 卻得到 null。
onPostExecute 執行於主執行緒,理論上可存取 UI。但常見導致 null 的原因:
setContentView 呼叫在 AsyncTask 啟動之後,或 Fragment 的 onCreateView 尚未完成。findViewById。class MyTask(private val listView: ListView) : AsyncTask<...>() {
override fun onPostExecute(result: Result) {
// 直接使用 listView
listView.adapter = adapter
}
}
// 呼叫處
val listView = findViewById<ListView>(R.id.list_view)
MyTask(listView).execute()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) // 先於 AsyncTask
MyTask().execute()
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val listView = view.findViewById<ListView>(R.id.list_view)
MyTask(listView).execute()
}
優先採用「建構子注入 View」模式,解耦 AsyncTask 與 Activity/Fragment 生命週期,避免時序問題。