Android - 从远程服务器加载多个图像的有效方法

标签 android client-server json android-image network-efficiency

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

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

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

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

提前感谢各位!

最佳答案

我认为最好的方法是通过 HTTP get 请求将图像文件作为普通图像文件下载。当然,请确保它是线程化的,并且有一个可以将请求排队到其中的线程池,并且有 2-3 个线程进行下载。

就保存它们而言,我个人会放弃保存到数据库中的 blob,而是选择将它们保存到应用程序私有(private)目录中的持久存储中。将图像文件以其文件名作为 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 的使用也可能会有所帮助,它为您执行许多缓存功能。

查看this link at the Android Developer site有关图像缓存的深入指南

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

关于Android - 从远程服务器加载多个图像的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14198949/

相关文章:

java - 调用抛出异常的方法时,是否必须在 Java 中包含 catch block ?

c - linux C 客户端-服务器编程。客户端收不到数据。本地主机

json - 如何执行 Azure 逻辑应用的 'null' 检查 'if' 条件操作

安卓方向传感器

java - 阻止 RecyclerView 加载所有数据

c++ - 如何从函数返回数组

java - Android 客户端实现错误

javascript - 为什么 json_encode 必须出现在 php 文件中而不是出现在外部 javascript 文件中?

javascript - 角色扮演游戏 : store dialog in DB or JSON

android - 如何重新创建 Android 快速设置滑动面板?