为什么在重装加载程序时我的片段会崩溃?

时间:2013-06-04 00:12:22

标签: android android-fragments android-loadermanager

虽然我无法复制此错误,但我仍然会收到一些崩溃报告。我想为我的列表适配器添加一个空检查会修复它,但它仍然会发生。我错过了什么?

完整的堆栈跟踪: 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以清除我的列表。是的,我在俯瞰什么?

1 个答案:

答案 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。