首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android AsyncTask onPostExecute 中 findViewById 回傳 null 的原因與解決

     編輯:程式設計綜合問答

問題現象

在 AsyncTask 的 onPostExecute 中呼叫 findViewById(R.id.list_view) 取得 ListView 卻得到 null。

原因分析

onPostExecute 執行於主執行緒,理論上可存取 UI。但常見導致 null 的原因:

  1. Layout 尚未載入:setContentView 呼叫在 AsyncTask 啟動之後,或 Fragment 的 onCreateView 尚未完成。
  2. View ID 錯誤:XML 中 ID 拼寫錯誤或非預期 Layout。
  3. Context 錯誤:在非 Activity Context(如 Application)呼叫 findViewById。

解決方案

方法一:建構子傳入 View 參考(推薦)

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()

方法二:確保 setContentView 先執行

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main) // 先於 AsyncTask
    MyTask().execute()
}

方法三:Fragment 中使用 view.findViewById

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    val listView = view.findViewById<ListView>(R.id.list_view)
    MyTask(listView).execute()
}

最佳實踐

優先採用「建構子注入 View」模式,解耦 AsyncTask 與 Activity/Fragment 生命週期,避免時序問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved