Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用较大的数据集快速滚动listview时的ANR_Android_Listview_Cursor - Fatal编程技术网

Android 使用较大的数据集快速滚动listview时的ANR

Android 使用较大的数据集快速滚动listview时的ANR,android,listview,cursor,Android,Listview,Cursor,我有使用SimpleCursorAdapter适配器的android listview,并且为listview启用了fastscroll。如果我有较小的数据集,快速滚动工作正常,但对于较大的数据集(超过4000条记录),快速滚动listview时,它将在 a*ndroid.os.BinderProxy.transact(本机方法) 位于android.database.BulkCursorProxy.getWindow(BulkCursorNative.java:215) 位于android.d

我有使用SimpleCursorAdapter适配器的android listview,并且为listview启用了fastscroll。如果我有较小的数据集,快速滚动工作正常,但对于较大的数据集(超过4000条记录),快速滚动listview时,它将在 a*ndroid.os.BinderProxy.transact(本机方法)

位于android.database.BulkCursorProxy.getWindow(BulkCursorNative.java:215) 位于android.database.bulkcursortocursorsadaptor.onMove(bulkcursortocursorsadaptor.java:104) 位于android.database.AbstractCursor.moveToPosition(AbstractCursor.java:188) 位于android.database.CursorWrapper.moveToPosition(CursorWrapper.java:187) 在android.widget.alphandexer.getPositionForSection(alphandexer.java:202)中*

还有logcat秀 *10-19 11:40:20.664 3026 3215 D光标:跳过第41行 10-19 11:40:20.773 3026 3215 E游标窗口:需要增长:mSize=1048576,size=55,freeSpace()=42,numRows=2471 10-19 11:40:20.773 3026 3215 E游标窗口:由于已存在2471行,因此未增长,最大大小为1048576 10-19 11:40:20.773 3026 3215 E游标:在2511,14处为文本/blob分配55字节失败 10-19 11:40:20.796 3026 3215 D光标:完成程序和获取行计数行1614*

我认为cursor正在为更大的数据集释放和分配内存。这导致了ANR

让我知道,如果你有任何好的解决方案来克服这个问题,并提前感谢

问候,,
Sathish

嗯,我也遇到了类似的问题。我给你的建议是创建一个定制的ArrayAdapter,而不是使用CursorAdapter。当屏幕显示时,从数据库中获取后端线程中的记录(在此之前向用户显示progressbar),将它们填入您的自定义Arrayadapter并显示给用户。获取所有记录需要时间,但Android数据库相对较慢,您无法为此做太多。一旦所有数据库对象都在内存中,您的快速滚动将非常快,因为所有内容都在内存中。我已经用30000条记录测试了这一点

-----优化逻辑以节省内存------

与为所有项提供完整的记录集不同,最初只获取所有项的主键并将其传递给自定义ArrayAdapter。重写getViews方法,并在该方法中获取该特定id的记录。您可以将不可见的项置空。这样,内存中只有可见的6到8项记录。
如果您在实现此功能时有进一步的疑问,请告诉我。

好吧,我曾经遇到过类似的问题。我给您的建议是创建一个自定义ArrayAdapter,而不是使用CursorAdapter。显示屏幕时,从数据库获取后端线程中的记录(在此之前向用户显示进度条),将它们填入您的自定义Arrayadapter并显示给用户。获取所有记录需要时间,但Android数据库相对较慢,您无法为此做太多。一旦所有数据库对象都在内存中,您的快速滚动将非常快,因为所有内容都在内存中。我已经用30000条记录测试了这一点

-----优化逻辑以节省内存------

与为所有项提供完整的记录集不同,最初只获取所有项的主键并将其传递给自定义ArrayAdapter。重写getViews方法,并在该方法中获取该特定id的记录。您可以将不可见的项置空。这样,内存中只有可见的6到8项记录。 如果您对实现此功能有进一步的疑问,请告诉我