如何有效管理Android中的本地和网络图像资源?

时间:2014-12-14 03:10:08

标签: android image android-volley

我正在开发一款应用,需要 -

  1. 从本地联系簿中提取联系方式和图片。
  2. 将此联系人数据(全部)同步到服务器。
  3. 在需要时从服务器提取联系人数据(图像)。
  4. 我基本上知道如何单独实现它们。例如,我已经设法拉取本地联系人,我还没有达到2和3.我对他们几乎没有任何疑问。

    1. 我在哪里保存图片(本地和联网)?我需要将它们保存在任何特定文件夹中吗?如果是,那么建议的方法是什么?
    2. 我在另一个项目中使用过volley库,我希望在这里再次使用它。 AFAIK,凌空在内存中缓存网络图像。但我相信在我的应用中,可能会有超过2000个联系人数据的用户。我的直觉是,并非所有图像都会永久保留在缓存中,因此如果我希望我的应用程序脱机工作,我将需要将图像存储在本地。我很困惑在哪里存储图像以及如何实现它。请注意,此应用程序将经常访问。
    3. 通过网络将图像数据发送到服务器的推荐方法是什么。
    4. 问题可能看起来很广泛,但考虑到单个应用程序,我觉得它们是紧密耦合的。我期待着关于实现这些功能的推荐方法的专家意见。

      谢谢!

3 个答案:

答案 0 :(得分:1)

您通常将它们保存到内部文件夹或目录中的SD卡。内部数据文件夹将锁定到您的应用程序(除非手机已植根)并且其他应用程序无法使用,SD卡将仅限4.3及更高版本。无论哪种方式,您都应该管理缓存的数据量,设置限制并且不允许它高于该值(在某些情况下将其踢出,很可能是LRU或LFU)。你需要亲自动手或者找一个库来为你做这件事,它不是内置于Android中的。

至于从服务器下载它们 - 通常只是一个HTTP请求,带有一个web服务,它会在发送图像结果或错误之前进行任何必要的隐私检查。你不想在这里做任何像JSON之类的东西,它只会浪费带宽。

答案 1 :(得分:0)

  1. 图像"没有推荐的目录。决定取决于你。但是你必须永远记住,用户设备上的内存是有限的,而在某些手机上,甚至额外的几兆字节都是不合适的支出。 The docs很清楚。
  2. 在用户设备上保存~2000张照片不是一个好主意。但是它又取决于你。 Volley库用于一般的https交互,但不适用于图像下载,编码和缓存。 Picasso旨在处理图片:从网络或Uri加载图片,具有缓存大小设置和许多其他功能。
  3. 这取决于您的服务器。如果您需要发送一些额外的数据,最常见的方法是POST http请求或多部分请求。

答案 2 :(得分:0)

关于第三个问题,如果您要继续使用Volley,可以尝试覆盖 getBody()以返回图片的字节,其余其他参数应该在URL内编码,这种方式将同时使用GET和POST方法。

public class ContactRequest extends StringRequest {

    public static String buildRequestUrl(String url,
        Map<String, String> params, String paramsEncoding) {
        StringBuilder urlBud = new StringBuilder(url).append('?');
        try {
            for (Map.Entry<String, String> entry : params.entrySet()) {
                urlBud.append(URLEncoder.encode(entry.getKey(), paramsEncoding));
                urlBud.append('=');
                urlBud.append(URLEncoder.encode(entry.getValue(), paramsEncoding));
                urlBud.append('&');
            }
            return urlBud.toString();
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("Encoding not supported: " + paramsEncoding);
        }
    }

    private String imageFilePath;

    public ContactRequest(String url, String imageFilePath,
        Response.Listener<String> listener, Response.ErrorListener errorListener) {
        super(Method.POST, url, listener, errorListener);
        this.imageFilePath = imageFilePath;
    }

    @Override
    public byte[] getBody() throws AuthFailureError {
        return getBytesFromFile(new File(imageFilePath));
    }
}

构建ContactRequest并像这样服务于RequestQueue:

String originUrl = "http://.../contact_push.do";
String imageFilePath = "/sdcard/.../contact_avatar_path";
Map<String, String> params = new HashMap<String, String>();
params.put("firstName", "Vince");
params.put("lastName", "Styling");
new ContactRequest(
    ContactRequest.buildRequestUrl(originUrl, params, HTTP.UTF_8),
    imageFilePath, null, null);

因为我以前从未遇到过这个问题,所以我不确定这个请求是否可以正确到达服务器,对我来说这是一个非测试解决方案,希望可以提供帮助。< / p>