doInBackground 回傳 Cursor 為 null,或在 onPostExecute 使用時已關閉,導致 NullPointerException。
dbHelper.fetchMainActivity() 內部提前呼叫 cursor.close()。private class LoadNewsLists extends AsyncTask<Void, Void, Cursor> {
@Override
protected Cursor doInBackground(Void... params) {
// 確保資料庫開啟,且不在這裡關閉 cursor
return dbHelper.fetchMainActivity(); // 應回傳有效 Cursor 或空 Cursor
}
@Override
protected void onPostExecute(Cursor cursor) {
if (cursor == null) {
Log.w("LoadNews", "Cursor is null");
return;
}
try {
String[] columns = { DatabaseUtil.rtitle, DatabaseUtil.rtypeof };
int[] to = { R.id.idTitle, R.id.idType };
SimpleCursorAdapter adapter = new SimpleCursorAdapter(
MainActivity.this, R.layout.listhome, cursor, columns, to, 0);
ListView listView = findViewById(R.id.list);
listView.setAdapter(adapter);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 注意:若 Adapter 仍在使用 Cursor,不可在這裡 close
// 由 Activity 生命週期管理(onDestroy 關閉)或使用 LoaderManager
}
}
}
CursorAdapter 會在 changeCursor 時關閉舊 Cursor)。try-with-resources 管理 SQLiteDatabase 連線。