2

我有一个 Android 应用程序,它可以从 php 远程服务器检索数据(图像+文本)并将它们显示在 GridView 中。我正在使用 Loaders 在后台进行操作。我对图像和文本有单独的连接,因为检索图像需要更长的时间,我想立即显示文本。从 MySQL 检索文本后,在服务器上使用 Json 对文本进行编码。在应用程序上,我正在解析 Json 对象并根据需要显示文本。

问题在于图像。我不确定用 Json 编码图像是否是个好主意。此外,图像在数据库中保存为 blob,为了使用 Json 对它们进行编码,我需要使用 base64_encode() 之前效率不高。我看过很多关于这个的帖子,但是当你必须得到一张图片时,它总是一个简单的例子。就我而言,我将检索多达 30 张小尺寸图像。

我的问题是,我可以继续我刚才介绍的内容,但似乎应该有更好的方法来做到这一点。你怎么看待这件事?我走错路了吗?

此外,我还在考虑是否可以在网格视图中单独显示每个图像,就像在“Google Play 应用程序”的 GridView 中一样(而不是等待所有图像都准备好)。我可以采取什么方法来实现这一目标?

先谢谢各位了!

4

2 回答 2

3

在我看来,最好的方法是通过 HTTP 获取请求将图像文件下载为普通图像文件。当然要确保它是线程化的,并且有一个线程池,您可以将请求排队到其中,并有 2-3 个线程通过并下载。

在保存它们方面,我个人将不再保存到数据库中的 blob,而是选择将它们保存到应用程序私有目录中的持久存储中。将图像文件以其文件名作为它们的 id 保存在您创建的数据库中将更快地重新加载它们。

您还可以保存对 ImageView 的引用,并让它最初显示一个占位符,成功的 HTTP 请求将 ImageView 的位图替换为您刚刚从存储中下载/读取的位图。

您还可以在您发出的 HTTP 请求中进行一些图像缓存。

ImageView myImageView = findViewById(R.id.testImage);
URL url = new URL("http://www.website.com/image.jpg");
URLConnection connection = url.openConnection();
connection.setUseCaches(true);
Object response = connection.getContent();
if (response instanceof Bitmap) {
  Bitmap bitmap = (Bitmap)response;
  myImageView.setBitmap(bitmap);
} 

查找 LRUCache 的使用也可能会有所帮助,它为您执行许多缓存功能。

查看Android 开发者网站上的此链接,了解图像缓存的深入指南

编辑: 您可以使用 Robert Rowntree 的答案中的建议来更有效地加载位图,以减少内存使用。该链接提供了使用较少内存加载位图的详细信息,如果您从通过网络下载并保存到本地存储的较大图像创建缩略图,这将很有效。

于 2013-01-07T15:54:19.180 回答
2

IMO - 有两个问题,将图像通过网络移动到客户端并加载它们。

假设您使用 http 作为协议,您应该有一个 httpclient 包中提供的 http 多线程解决方案。这样可以快速将照片发送到手机。

然后,您必须通过将它们放入内存和缓存来呈现图片。在这里,您可以考虑“gallery3D”应用程序对其网格和位图的作用,但通过该代码阅读它非常复杂。

退房 - http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

查看用于从位图中加载拇指的代码示例。

于 2013-01-07T15:39:03.483 回答