使用较大的数据集快速滚动列表视图时的ANR

时间:2011-10-19 15:00:02

标签: android listview cursor

我使用SimpleCursorAdapter适配器安装了android listview,并为listview启用了fastscroll。如果我有较小的数据集,快速滚动工作正常,但对于大型数据集(超过4000条记录),同时快速滚动列表视图,它将通过ANR in    a * ndroid.os.BinderProxy.transact(原生方法)

在android.database.BulkCursorProxy.getWindow(BulkCursorNative.java:215)   在android.database.BulkCursorToCursorAdaptor.onMove(BulkCursorToCursorAdaptor.java:104)   在android.database.AbstractCursor.moveToPosition(AbstractCursor.java:188)   在android.database.CursorWrapper.moveToPosition(CursorWrapper.java:187)   在android.widget.AlphabetIndexer.getPositionForSection(AlphabetIndexer.java:202)*

还有logcat显示 * 10-19 11:40:20.664 3026 3215 D光标:skip_rows第41行 10-19 11:40:20.773 3026 3215 E CursorWindow:需要增长:mSize = 1048576,size = 55,freeSpace()= 42,numRows = 2471 10-19 11:40:20.773 3026 3215 E CursorWindow:没有增长,因为已有2471行,最大尺寸1048576 10-19 11:40:20.773 3026 3215 E光标:在2511,14处为text / blob分配55个字节失败 10-19 11:40:20.796 3026 3215 D光标:finish_program_and_get_row_count第1614行*

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

如果您有任何好的解决方案可以解决这个问题并提前感谢,请告诉我

此致 Sathish所在

1 个答案:

答案 0 :(得分:0)

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

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

不是为所有项目制作完整的记录集,而是仅为最初的所有项目获取主键并将其传递给Custom ArrayAdapter。重写getViews方法,然后获取该特定id的记录。您可以清空不可见的项目。这样,只有可见的6到8项记录将在内存中。 如果您在实施此问题时有进一步的疑问,请与我们联系。

相关问题