虽然我无法复制此错误,但我仍然会收到一些崩溃报告。我想为我的列表适配器添加一个空检查会修复它,但它仍然会发生。我错过了什么?
完整的堆栈跟踪: http://pastebin.com/Q6GwDU7Q
public void onLoaderReset(Loader<Cursor> loader) {
final int id = loader.getId();
switch (id) {
case LOADER_ID1:
if (mAdapter != null)
mAdapter.changeCursor(null); //Line 512 where stacktrace references
break;
case LOADER_ID2:
//Other code here
break;
default:
throw new InvalidParameterException("id=" + id);
}
}
mAdapter在onActivityCreated中初始化,但我知道在输入时我不会发布它,也许我应该在onDetach中执行它? mAdapter附加到ListFragment设置的ListView。我将适配器光标设置为null以清除我的列表。是的,我在俯瞰什么?
答案 0 :(得分:0)
在搜索了Android源代码之后,我现在看到像GreyBearedGeek所说的那样,我应该允许加载器处理Cursor破坏。
正如您在CursorLoader中看到的那样,如果传递一个新游标,它将处理关闭旧游标:
/* Runs on the UI thread */
@Override
public void deliverResult(Cursor cursor) {
if (isReset()) {
// An async query came in while the loader is stopped
if (cursor != null) {
cursor.close();
}
return;
}
Cursor oldCursor = mCursor;
mCursor = cursor;
if (isStarted()) {
super.deliverResult(cursor);
}
if (oldCursor != null && oldCursor != cursor && !oldCursor.isClosed()) {
oldCursor.close();
}
}
以及在重置时关闭光标。
@Override
protected void onReset() {
super.onReset();
// Ensure the loader is stopped
onStopLoading();
if (mCursor != null && !mCursor.isClosed()) {
mCursor.close();
}
mCursor = null;
}
所以我将来会使用swapCursor来不干扰CursorLoaders处理,即使我还没有看到它如何在上面的堆栈跟踪中导致我的NPE。