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

Android AsyncTask onPostExecute 中 ListView.setAdapter 空指針異常排查

     編輯:程式設計綜合問答

異常堆疊:java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference 明確指出:調用 setAdapter 的 ListView 對象為 null。

常見原因與修復

  1. 未正確初始化 ListView:
    // 錯誤:在 Fragment 中未用 view.findViewById
    ListView listView = findViewById(R.id.list_view); // 缺少 view.
    
    // 正確:
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_layout, container, false);
        ListView listView = view.findViewById(R.id.list_view); // 必須用 view.
        // ...
    }
    
  2. 布局文件中 ID 拼寫錯誤:android:id="@+id/list_view" vs 代碼 R.id.listView(大小寫、下劃線)。
  3. Fragment/Activity 生命周期問題:AsyncTask 執行期間 Fragment 已銷毀,onPostExecute 運行時 getView() 返回 null。解決:在 onDestroy 取消任務 task.cancel(true),或用 WeakReference 持有 View。
  4. 錯誤的上下文引用:在非 UI 線程或錯誤 Context 中查找 View。

調試步驟

  1. 在 onPostExecute 首行打印 Log.d("TAG", "listView=" + listView) 確認是否為 null。
  2. 檢查布局 XML 是否包含該 ID 的 ListView。
  3. 確認 findViewById 在正確的 View 層級調用(Fragment 用 view.,Activity 用 this.)。

現代替代方案

棄用 AsyncTask(API 30 棄用),改用:

  • ExecutorService + runOnUiThread
  • LiveData + ViewModel + 協程
  • RxJava / Flow

核心教訓:任何調用 View 方法前必須確保 View 非空且附著於窗口,這是 Android UI 開發的鐵律。

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