如何创建类似blackberry listfield的表?

如何创建类似blackberry listfield的表?,blackberry,Blackberry,我目前正在从服务器下载471个缩略图,将尺寸加倍,保存在设备上,并使用带有自定义图像字段的TableLayoutManager来显示它们。然而,我认为创建这些额外的471个自定义图像字段会导致巨大的内存泄漏 我在下载过程中监控了内存使用情况,在垃圾收集器启动之前,内存只缓慢增加到10-18MB左右,所以没有问题。但是,一旦所有缩略图都缓存在手机上,它将使用大约100多兆字节从磁盘读取图像,大小将增加一倍,创建471自定义图像字段并显示它们。471个缩略图的总大小为427KB。系统如何使用这么多内

我目前正在从服务器下载471个缩略图,将尺寸加倍,保存在设备上,并使用带有自定义图像字段的TableLayoutManager来显示它们。然而,我认为创建这些额外的471个自定义图像字段会导致巨大的内存泄漏

我在下载过程中监控了内存使用情况,在垃圾收集器启动之前,内存只缓慢增加到10-18MB左右,所以没有问题。但是,一旦所有缩略图都缓存在手机上,它将使用大约100多兆字节从磁盘读取图像,大小将增加一倍,创建471自定义图像字段并显示它们。471个缩略图的总大小为427KB。系统如何使用这么多内存来加载这些文件

但是,如果我能够像tablelayoutmanager那样使用listfield,那么我就不必创建那些额外的471个自定义图像字段,而只需直接将图像添加到listfield

有没有人做过类似的事情,或者有过如何使用listfield实现类似于表的格式的示例

427kb是PNG图像的下载大小。PNG被压缩。当您在内存中打开它们时,它们实际上会扩展,因此图像中的每个像素最多可以包含4个字节的ARGB值,具体取决于格式和其他PNG元数据

以两倍大小的尺寸保存缩略图,不一定会产生两倍大小的文件。它可以大也可以小,这取决于图像以及图像压缩程序的性能

将图像直接添加到列表字段不会有任何区别。您仍然可以将它们加载到内存中。你需要做的是在内存中有一些可管理的缓存,比如说最多20个图像。您的代码需要足够聪明,以便随时检测用户在列表字段中的位置,并显示该视图的图像

因此,假设每个列表字段对象或行都有一个与相应图像关联的标记,例如filename。用户完成向上/向下滚动后,可以加载该视图的图像。如果列表字段中显示的第一行是第20行,并且您可以显示8个项目,则需要抓取图像20-28并将其加载到内存缓存中(如果它们尚未存在),因此请首先检查缓存。然后在列表字段上调用invalidate以确保它重新绘制

线程:

a您不需要线程来检测用户在任何点的位置。您应该能够使用moveFocus方法或导航方法,并找出用户所在的位置

b要加载图像,您需要一个排队机制。一旦您了解了线程/锁定机制,任务队列就很容易实现。队列中的每个任务都将在其自己的线程中加载映像。您需要设置队列中一次活动的任务线程数限制。我会去3-5最大这是从经验的BB平台。对于队列实现,我建议阅读任务/作业队列以及生产者/消费者问题


上述机制被大量使用。这就是为什么当您向下滚动联系人列表时,您可能会看到在联系人姓名旁边加载和渲染联系人图像之前有一点延迟。

我之前已经完成了您提到的线程部分。您提到的第一部分,我也在考虑实现,以减少内存中的巨大跳跃。我想到的另一个优化是将它们重新调整大小,这样我就不必每次都重新调整它们的大小。保存它们并重新调整大小的唯一问题是透明度丢失。