【问题标题】:Android - Efficient way to load multiple images from remote serverAndroid - 从远程服务器加载多个图像的有效方法
【发布时间】:2013-01-07 15:31:52
【问题描述】:

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

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

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

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

在此先感谢各位!

【问题讨论】:

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


    【解决方案1】:

    在我看来,最好的方法是通过 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 的使用情况也可能会有所帮助,它为您执行大量缓存功能。

    查看this link at the Android Developer site 以获得关于图像缓存的深入指南

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

    【讨论】:

    • 感谢您的回答。您已经提到使用多个线程。在我的应用程序中,我使用 Loaders 从远程服务器获取文本。对图像做同样的事情是一种不好的方法吗?此外,即使使用加载器或多个线程,我不应该做更多的事情来分别加载每个图像吗?
    • 加载器是最近才引入的,所以我对它们没有太多经验。我不知道他们在这种情况下的好处/缺点。我建议的方法是 2-3 个线程,它们从 Vector 或 Queue 读取图像请求,执行 AsyncTask,然后在 Queue 中寻找另一个图像。如果没有找到,则线程死亡。保持线程计数,如果计数低于您的最大值,则开始一个新线程
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 感谢您的回复!我正在使用加载程序从远程服务器获取图像和文本,这是您对“多线程解决方案”的意思还是其他?感谢您提供有用的链接!
    • stackoverflow.com/questions/8138128/multi-threading-httpclient 为了使网络饱和,你应该学习使用线程连接池管理器的细节......
    猜你喜欢
    • 2020-07-03
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2016-09-14
    相关资源
    最近更新 更多