带有simplecursor适配器的Android列表视图使应用程序崩溃(未显示ANR)
在使用SimpleCursorAdapter时,listview出现了一个奇怪的问题。这里是错误带有simplecursor适配器的Android列表视图使应用程序崩溃(未显示ANR),android,listview,simplecursoradapter,Android,Listview,Simplecursoradapter,在使用SimpleCursorAdapter时,listview出现了一个奇怪的问题。这里是错误 08-31 21:50:14.540: INFO/dalvikvm(12195): Uncaught exception thrown by finalizer (will be discarded): 08-31 21:50:14.540: INFO/dalvikvm(12195): java.lang.IllegalStateException: Binder has been finalize
08-31 21:50:14.540: INFO/dalvikvm(12195): Uncaught exception thrown by finalizer (will be discarded):
08-31 21:50:14.540: INFO/dalvikvm(12195): java.lang.IllegalStateException: Binder has been finalized!
08-31 21:50:14.540: INFO/dalvikvm(12195): at android.os.BinderProxy.transact(Native Method)
08-31 21:50:14.540: INFO/dalvikvm(12195): at android.database.BulkCursorProxy.close(BulkCursorNative.java:289)
08-31 21:50:14.540: INFO/dalvikvm(12195): at android.database.BulkCursorToCursorAdaptor.close(BulkCursorToCursorAdaptor.java:141)
08-31 21:50:14.540: INFO/dalvikvm(12195): at android.database.CursorWrapper.close(CursorWrapper.java:43)
08-31 21:50:14.540: INFO/dalvikvm(12195): at android.content.ContentResolver$CursorWrapperInner.close(ContentResolver.java:1575)
08-31 21:50:14.540: INFO/dalvikvm(12195): at android.content.ContentResolver$CursorWrapperInner.finalize(ContentResolver.java:1586)
08-31 21:50:14.540: INFO/dalvikvm(12195): at dalvik.system.NativeStart.run(Native Method)
我已经在我的cursorAdapter中实现了runQueryOnBackgroundThread,它由活动的Filter.Filter方法调用调用。因此,我的活动中没有任何光标的引用。每次查询时,我都会在游标适配器中得到游标更改回调,它扩展了SimpleCursorAdapter
这是它的样子
public void changeCursor(Cursor cursor) {
Log.d(TAG, "Cursor changed ... **************** "+ cursor);
if (cursor != null) {
setLoading(false);
}
super.changeCursor(cursor);
initSectionHeaders(cursor);
notifyDataSetChanged();
}
runQueryOnBackgroundThread()
只是从查询返回一个游标
我是否遗漏了什么,光标是否应该在任何地方关闭或管理?任何关于线索的帮助都会大有帮助。提前谢谢
**更新**我的适配器片段
public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
Log.d(TAG, "runQueryOnBackgroundThread "+ constraint);
if (getFilterQueryProvider() != null) {
return getFilterQueryProvider().runQuery(constraint);
}
return doQuery(constraint, People.CONTENT_URI);
}
private Cursor doQuery(CharSequence constraint, Uri queryUri){
StringBuilder selectionStrBuilder = new StringBuilder();
String selectionArgs[] = null;
String selection = null;
if(constraint!=null){
//ADDING GLOB so that the sql query can interpret linux style wildcards
selectionStrBuilder.append("(UPPER(").append(People.DISPLAY_NAME).append(") GLOB ?)");
selection = selectionStrBuilder.toString();
String constraintStr = constraint.toString().toUpperCase();
//prepend and append '*' - TODO improve
constraintStr = "*"+ constraintStr;
constraintStr +="*";
selectionArgs = new String[]{constraintStr};
}
ContentResolver contentRes = context.getContentResolver();
return contentRes.query(queryUri, null, selection, selectionArgs, People.DISPLAY_NAME);
}
除了这两个函数之外,我已经像前面发布的那样覆盖了changeCursor,并在bind视图中使用游标来获取数据。我不会在其他任何地方关闭或修改光标属性
我的提供者getQuery函数看起来像
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
// Tell the cursor what uri to watch,
// so it knows when its source data changes
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
更新2*
当我在模拟器上运行相同的程序时,我得到了这个堆栈跟踪,这与我在平板电脑上看到的非常不同
01-03 17:21:44.130: ERROR/IMemory(9328): binder=0x3891a0 transaction failed fd=-2147483647, size=0, err=-2147483646 (Unknown error: 2147483646)
01-03 17:21:44.130: ERROR/IMemory(9328): cannot dup fd=-2147483647, size=0, err=-2147483646 (Bad file number)
01-03 17:21:44.130: ERROR/IMemory(9328): cannot map BpMemoryHeap (binder=0x3891a0), size=0, fd=-1 (Bad file number)
01-03 17:21:44.130: WARN/dalvikvm(9328): JNI WARNING: JNI method called with exception raised
01-03 17:21:44.130: WARN/dalvikvm(9328): in Ldalvik/system/NativeStart;.run ()V (CallStaticVoidMethodV)
01-03 17:21:44.130: WARN/dalvikvm(9328): Pending exception is:
01-03 17:21:44.130: INFO/dalvikvm(9328): Ljava/lang/RuntimeException;: No memory in memObj
01-03 17:21:44.130: INFO/dalvikvm(9328): at android.database.CursorWindow.native_init(Native Method)
01-03 17:21:44.130: INFO/dalvikvm(9328): at android.database.CursorWindow.<init>(CursorWindow.java:518)
01-03 17:21:44.130: INFO/dalvikvm(9328): at android.database.CursorWindow.<init>(CursorWindow.java:27)
01-03 17:21:44.130: INFO/dalvikvm(9328): at android.database.CursorWindow$1.createFromParcel(CursorWindow.java:493)
01-03 17:21:44.130: INFO/dalvikvm(9328): at android.database.CursorWindow$1.createFromParcel(CursorWindow.java:491)
01-03 17:21:44.130: INFO/dalvikvm(9328): at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:103)
01-03 17:21:44.130: INFO/dalvikvm(9328): at android.os.Binder.execTransact(Binder.java:320)
01-03 17:21:44.130: INFO/dalvikvm(9328): at dalvik.system.NativeStart.run(Native Method)
01-03 17:21:44.130: INFO/dalvikvm(9328): "Binder Thread #3" prio=5 tid=9 NATIVE
01-03 17:21:44.130: INFO/dalvikvm(9328): | group="main" sCount=0 dsCount=0 obj=0x405de828 self=0x8e288
01-03 17:21:44.130: INFO/dalvikvm(9328): | sysTid=9336 nice=0 sched=0/0 cgrp=[fopen-error:24] handle=959480
01-03 17:21:44.130: INFO/dalvikvm(9328): at dalvik.system.NativeStart.run(Native Method)
01-03 17:21:44.130: ERROR/dalvikvm(9328): VM aborting
01-03 17:21:44.130:ERROR/IMemory(9328):binder=0x3891a0事务失败fd=-2147483647,size=0,err=-2147483646(未知错误:2147483646)
01-03 17:21:44.130:ERROR/IMemory(9328):无法复制fd=-2147483647,size=0,err=-2147483646(错误文件号)
01-03 17:21:44.130:错误/IMemory(9328):无法映射BpMemoryHeap(活页夹=0x3891a0),大小=0,fd=-1(错误文件号)
01-03 17:21:44.130:WARN/dalvikvm(9328):JNI警告:调用JNI方法时引发异常
01-03 17:21:44.130:WARN/dalvikvm(9328):在Ldalvik/system/NativeStart;中;。运行()V(CallStaticVoidMethodV)
01-03 17:21:44.130:WARN/dalvikvm(9328):挂起的异常是:
01-03 17:21:44.130:INFO/dalvikvm(9328):Ljava/lang/RuntimeException;:memObj中没有内存
01-03 17:21:44.130:INFO/dalvikvm(9328):在android.database.CursorWindow.native_init(本机方法)
01-03 17:21:44.130:INFO/dalvikvm(9328):在android.database.CursorWindow.(CursorWindow.java:518)
01-03 17:21:44.130:INFO/dalvikvm(9328):位于android.database.CursorWindow.(CursorWindow.java:27)
01-03 17:21:44.130:INFO/dalvikvm(9328):在android.database.CursorWindow$1.createFromParcel(CursorWindow.java:493)
01-03 17:21:44.130:INFO/dalvikvm(9328):在android.database.CursorWindow$1.createFromParcel(CursorWindow.java:491)
01-03 17:21:44.130:INFO/dalvikvm(9328):位于android.content.ContentProviderNative.onTransact(ContentProviderNative.java:103)
01-03 17:21:44.130:INFO/dalvikvm(9328):位于android.os.Binder.execTransact(Binder.java:320)
01-03 17:21:44.130:INFO/dalvikvm(9328):在dalvik.system.NativeStart.run(本机方法)
01-03 17:21:44.130:INFO/dalvikvm(9328):“粘合剂螺纹#3”prio=5 tid=9本机螺纹
01-03 17:21:44.130:INFO/dalvikvm(9328):| group=“main”scont=0 dsCount=0 obj=0x405de828 self=0x8e288
01-03 17:21:44.130:INFO/dalvikvm(9328):| sysTid=9336 nice=0 sched=0/0 cgrp=[fopen error:24]handle=959480
01-03 17:21:44.130:INFO/dalvikvm(9328):在dalvik.system.NativeStart.run(本机方法)
01-03 17:21:44.130:错误/dalvikvm(9328):VM正在中止
并使应用程序崩溃
我发现了关于这个问题的错误报告
有人面临同样的问题吗?任何帮助都将不胜感激。
谢谢啊,终于找到了解决这个问题的办法。只是框架其他部分中的某个游标被打开了。关闭时工作 啊,终于找到了解决这个问题的办法。只是框架其他部分中的某个游标被打开了。关闭时工作 只是提醒一下。这不是一个ANR,而是一个应用程序崩溃升级**,带有适配器代码段。我不知道,提供程序如何从sqlite读取数据存在任何问题。我替换了提供程序以返回MatrixCursor,但我仍然看到相同的问题。解决方案有进展吗?没有:(还没有。你找到解决方案了吗?只是提醒一下。这不是ANR,而是一个应用程序崩溃更新**,带有适配器代码段。我不知道,提供程序从sqlite读取数据的方式有任何问题。我替换了提供程序以返回MatrixCursor,但我仍然看到相同的问题。解决方案有任何进展吗?否:(还没有。你找到解决方法了吗?你是指通过框架打开的光标?还是由你自己打开的光标?我面临着同样的问题。我使用startManagingCursor关闭光标。有什么问题吗?这是因为我打开的光标没有关闭。你是指通过框架打开的光标?还是由你自己打开的光标?我面临着同样的问题同样的问题。我使用startManagingCursor关闭光标。它有什么问题吗?这是因为我打开的光标没有关闭。