2011-09-02 186 views
2

我想为我的应用程序制作图片浏览器,用户可以从手机中选择他想要的图片。我从手机上读取每个图像是这样的:黑莓图片浏览器

FileConnection fileConnection = (FileConnection)Connector.open((String) imm.elementAt(i)); 
InputStream inputStream = fileConnection.openInputStream(); 
byte[] imageBytes = new byte[(int)fileConnection.fileSize()]; 
inputStream.read(imageBytes); 
inputStream.close(); 
fileConnection.close(); 

EncodedImage image = EncodedImage.createEncodedImage(imageBytes, 0, -1); 
EncodedImage image1 = scaleImageEncoded.scaleImage(image, (int) (Display.getWidth()/4) - 10, (int) (Display.getWidth()/4) - 10); 
BrowseBitmapField field = (BrowseBitmapField) manager.getField(i); 
field.setBitmap(image1.getBitmap()); 
field.setEncodedImage(image); 

当手机包含许多图像,这个过程bicomes太慢,手机需要大量的时间,让他们。有没有更快的方法从手机内存中读取图像并显示它?

在此先感谢

回答

1

在下面的URL发布的人发现你可以从BBThumbs.dat获得缩略图并发布了一些代码。我没有自己尝试过,但如果它有效,节省的时间应该非常显着。

http://supportforums.blackberry.com/t5/Java-Development/Thumbnails-work-around/td-p/343870

+0

我在哪里可以找到BBThubms.dat?我在任何地方搜索了每个包含图像的目录,但无法找到它 –

+0

在内部存储器和\ appdata \ rim \ media上尝试\ BlackBerry \ system \ media,这就是他们住在我的BB –

+0

上的位置,但这两个文件夹都隐藏了。 。如何阅读他们的内容呢?使用fileConnection.openInputStream()时抛出文件未找到的异常。阅读文件 –

2

您可以尝试使用的BufferedInputStream。我很幸运,它加快了我的阅读时间,可能也适合你。

BufferedInputStream inputStream = new BufferedInputStream(fileConnection.openInputStream()); 
byte[] imageBytes = new byte[(int)fileConnection.fileSize()]; 
inputStream.read(imageBytes, 0, imageBytes.length); 
+0

嘿jprofitt,我正在尝试你的代码。我可以在黑莓的API中看到BufferedInputStream,但是当我将它导入到JDE 6.0中时,它告诉我没有“java.io.BufferedInputStream”!我无法在导入中找到它!如何使用这个?这是我第一次看到这个问题 –

+0

这是一个有趣的问题。我看了一下API,并做了一些探讨,显然它不包含在6.0 OS – jprofitt

+0

那么如何包含它呢? –

3

除了什么jprofitt建议我建议做到以下几点:

  1. 当您创建图像的尺寸调整后的版本,你可以将其保存以备将来使用。下次用户单击同一图像时,首先检查是否存在调整大小的图像,如果不存在,则只读取/调整原始图像的大小。因此,您可以节省将来调整大小所需的时间+不要忘记调整大小的图像文件大小比原始大小小,因此未来的阅读速度会快得多。

  2. 不要尝试一次读取/调整目录中的所有图像的大小。这样做只适用于那些目前应该对用户可见的应用程序。例如,如果目录有100张图片,您很可能需要很长时间才能读取/调整大小/附加到管理器的所有图像。但是,用户一次只能在屏幕上看到6或8张图像。如果用户向上/向下滚动,那么现在是时候请求读取/调整大小/等的图像,现在应该是可见的,但尚未被读取/调整大小。

  3. 为了不阻止主UI线程,应在背景Thread上进行读/调整大小。换句话说,用户应该能够在阅读/调整大小时在背景Thread上滚动屏幕。我建议安排一个阅读/调整大小任务的队列,并在后台工作人员Thread上执行它们。在工作人员Thread上完成任务并且需要使用调整大小的图像更新屏幕的UI时,请使用UiApplication.invokeLater(Runnable action)

+0

嘿arhimed ...你说的所有事情都是在之前完成的。我正在保存原始编码图像供将来使用,并且我不是一次调整所有图片的大小,而是在一个线程中完成工作,以确保稍后使用该调用。但是这很慢,这就是为什么我在这里发布,所以我们可以找到更好的解决方案。你有没有试图制作一个图像浏览器urslef? –

+0

是的,在其中一个项目中有这样一个组件。我们从服务器获取图像,然后必须为它创建图像浏览器。我记得我们在下载后立即调整了下载的图像大小,因此在图像浏览器中阅读/显示图像时,我们已经调整了图像大小。 –

+0

是的,但事实并非如此。在这里,我正在从设备内存中读取它们。问题是每个文件需要被收回的时间太多了。我想尽量减少这个时间。下载图像并将它们作为字节不是我的情况,因为在这里我正在从手机读取字节太慢的字节。 –