android.database.StaleDataException:在游标关闭后尝试访问它

时间:2015-01-13 09:37:46

标签: android cursor

这是当我按下主页按钮时强制关闭的片段活动,错误是在关闭后尝试访问光标。错误在哪里我也尝试使用getContentResolver()。query()而不是managedQuery()相同的错误。

我的MainActivity是SherlockFragmentActivity选项卡和查看分页器

private Cursor getInternalAudioCursor(String selection,
        String[] selectionArgs) {
    return getActivity().managedQuery(
            MediaStore.Audio.Media.INTERNAL_CONTENT_URI,
            INTERNAL_COLUMNS,
            selection,
            selectionArgs,
            MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
}

private Cursor getExternalAudioCursor(String selection,
        String[] selectionArgs) {
    return getActivity().managedQuery(
            MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
            EXTERNAL_COLUMNS,
            selection,
            selectionArgs,
            MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
}

Cursor createCursor(String filter) {
    ArrayList<String> args = new ArrayList<String>();
    String selection;

    if (mShowAll) {
        selection = "(_DATA LIKE ?)";
        args.add("%");
    } else {
        selection = "(";
        for (String extension : CheapSoundFile.getSupportedExtensions()) {
            args.add("%." + extension);
            if (selection.length() > 1) {
                selection += " OR ";
            }
            selection += "(_DATA LIKE ?)";
            selection  = selection  + "AND (IS_MUSIC=1)";
        }
        selection += ")";

        selection = "(" + selection + ") AND (_DATA NOT LIKE ?)";
        args.add("%espeak-data/scratch%");
    }

    if (filter != null && filter.length() > 0) {
        filter = "%" + filter + "%";
        selection =
            "(" + selection + " AND " +
            "((TITLE LIKE ?) OR (ARTIST LIKE ?) OR (ALBUM LIKE ?)))";
        args.add(filter);
        args.add(filter);
        args.add(filter);
    }

    String[] argsArray = args.toArray(new String[args.size()]);

    getExternalAudioCursor(selection, argsArray);
    getInternalAudioCursor(selection, argsArray);

    Cursor c = new MergeCursor(new Cursor[] {
            getExternalAudioCursor(selection, argsArray),
            getInternalAudioCursor(selection, argsArray)});
    getActivity().startManagingCursor(c);
    return c;
}

Eroor日志:

01-13 15:02:16.049: E/AndroidRuntime(12435): java.lang.RuntimeException: Unable to resume activity {com.my.ringtone/com.my.ringtone.MainActivity}: android.database.StaleDataException: Attempted to access a cursor after it has been closed.
01-13 15:02:16.049: E/AndroidRuntime(12435):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2946)
01-13 15:02:16.049: E/AndroidRuntime(12435):    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2975)
01-13 15:02:16.049: E/AndroidRuntime(12435):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1307)
01-13 15:02:16.049: E/AndroidRuntime(12435):    at android.os.Handler.dispatchMessage(Handler.java:102)
01-13 15:02:16.049: E/AndroidRuntime(12435):    at android.os.Looper.loop(Looper.java:157)
01-13 15:02:16.049: E/AndroidRuntime(12435):    at android.app.ActivityThread.main(ActivityThread.java:5356)
01-13 15:02:16.049: E/AndroidRuntime(12435):    at java.lang.reflect.Method.invokeNative(Native Method)
01-13 15:02:16.049: E/AndroidRuntime(12435):    at java.lang.reflect.Method.invoke(Method.java:515)
01-13 15:02:16.049: E/AndroidRuntime(12435):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
01-13 15:02:16.049: E/AndroidRuntime(12435):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
01-13 15:02:16.049: E/AndroidRuntime(12435):    at dalvik.system.NativeStart.main(Native Method)
01-13 15:02:16.049: E/AndroidRuntime(12435): Caused by: android.database.StaleDataException: Attempted to access a cursor after it has been closed.
01-13 15:02:16.049: E/AndroidRuntime(12435):    at android.database.BulkCursorToCursorAdaptor.throwIfCursorIsClosed(BulkCursorToCursorAdaptor.java:64)

1 个答案:

答案 0 :(得分:0)

请使用getActivity().getContentResolver().query();代替getActivity().managedQuery();

相关问题