我正在为 Android Api 15 及更高版本开发应用程序。
一段时间以来,我一直在使用自定义CursorAdapter
实现。ListView
我的印象是,即使有数千行(记录),ListView
也能处理性能方面的问题。
我的手机,索尼 Xperia U,滚动超过 10 到 20 行时很难。前几行滚动得很好,然后我遇到了口吃,设备变得无响应(总共 70 行)。它正在运行 Android 4.0.4。三星 S3 和索尼 Xperia Z 等其他手机的性能要好得多,但到什么时候才会降级。这两款手机运行的是 4.1。我CursorWindow
在 Xperia U 上收到以下警告。
我已经实现了交易、ViewHolder
模式等方面的所有技巧,并且所有图像都加载在AsyncTask
's.
无论如何,我在性能方面遇到的麻烦并不在于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
我还读到可能在 4.2 中存在问题,CursorWindow
但这可能是错误的:
当涉及到每一行的数据时,我有一个SQLite
blob
:
byte[] avatar = cursor.getBlob(cursor.getColumnIndex(Profile.TABLE_COLUMN_AVATAR));
我认为这可能是问题之一,但我不确定。我可能应该将图像切换到 SD 卡并将路径存储在数据库中。不过,我想保留我当前的设置。
这表明我目前的方法将无法管理,因此可能需要一种新方法。所以这让我想到了一个 Endless Adapter 解决方案,这意味着获取带有限制/偏移量的游标数据并填充ArrayAdapter
和使用像 CommonWare 的框架EndlessAdapter
(也许)?
CursorAdapter
我的性能问题是否与使用s相比更少而更多Blob
?- 我应该对潜在的大型数据集使用 Endless Adapter 方法吗?
- 4 年后, CommonWare
EndlessAdapter
仍然是一个好的解决方案吗?