我正在为Android Api 15及更高版本开发应用程序。
我已经使用CursorAdapter
的自定义ListView
实施了一段时间了。我的印象是,即使有数千行(记录),ListView
也会处理性能方面的问题。
我的手机,索尼Xperia U,很难滚动超过10到20行。前几行滚动得很好然后我撞到了一个口吃的墙,设备变得没有响应(总共70行)。它运行的是Android 4.0.4。其他手机,如三星S3和索尼Xperia Z表现得更好,但在什么时候这会降低。这两部手机正在运行4.1。我收到了Xperia U上的CursorWindow
警告。
我已经实现了交易中的所有技巧,ViewHolder
模式等,所有图片都加载到AsyncTask
内。
无论如何,我遇到的关于表现的麻烦并不在于BindView
。 BindView
方法很快就完成了 - 在1-3毫秒内完成。
我认为问题在于CursorWindow
。我真的不知道这是什么!
08-14 21:01:58.913: W/CursorWindow(7116): Window is full: requested allocation 277981 bytes, free space 148792 bytes, window size 2097152 bytes
我还读到CursorWindow
中有一个问题,最多可能是4.2,但这可能是错误的:
说到每行的数据,我有一个SQLite
blob
:
byte[] avatar = cursor.getBlob(cursor.getColumnIndex(Profile.TABLE_COLUMN_AVATAR));
我认为这可能是其中一个问题,但我不确定。我可能应该将图像切换到SD卡并将路径存储在DB中。我想保留目前的设置。
这表明我目前的方法不可控,因此可能需要一种新的方法。所以这让我想到了一个无限适配器解决方案,这意味着使用限制/偏移来获取游标数据并填充ArrayAdapter
并使用像CommonWare EndlessAdapter
这样的框架(可能)?
CursorAdapter
使用Blob
时,我的表现问题是否更少?EndlessAdapter
仍然是一个很好的解决方案吗?答案 0 :(得分:0)
使用Blobs时,我的性能问题与CursorAdapter有关吗?
使用Traceview确定问题的确切位置。在将来,您可能还会考虑在您的问题中更具体,因为我们不知道“困难时期”意味着什么。
我是否应该使用具有潜在大型数据集的无限适配器方法?
如果您的“困难时期”最初是从数据库中加载数据,也许,尽管有人可能有一个无限列表解决方案,可以使用一组CursorAdapters
正常工作。
如果你的“困难时期”在滚动搜索结果,那么不,EndlessAdapter
或等价物对你没用。
CommonWare的EndlessAdapter 4年后仍然是一个很好的解决方案吗?
对于它的用例,当然。然后,我有点偏见。 : - )