【问题标题】:Volley, How many times the onResponse in ImageLoader.ImageListener calledVolley,ImageLoader.ImageListener 中的 onResponse 调用了多少次
【发布时间】:2015-08-26 01:42:21
【问题描述】:

我使用Volley 进行互联网请求。我认为onResponse 方法在收到响应时应该只调用一次,但我发现它调用了两次。

这是我的代码:

YVolley.getInstance(context).getImageLoader().get(category.child.get(i).icon, new ImageLoader.ImageListener() {
                @Override
                public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
                    Drawable drawable = new BitmapDrawable(context.getResources(), response.getBitmap());
                    drawable.setBounds(0, 0, GeneralUtil.dip2px(context, 45), GeneralUtil.dip2px(context, 45));
                    button.setCompoundDrawables(null, drawable, null, null);
                    Log.i("swifter", "get icon ... success == "+url);
                }

                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.i("swifter", "get drawable icon error...");
                }
            });

“成功”日志打印了两次。

我的代码有问题还是应该是这样的?

【问题讨论】:

  • 或许,第一个来自缓存请求

标签: android android-intent android-volley


【解决方案1】:

我在the documentation for ImageLoader.java 中找到了答案。文档指出:

调用流程是这样的:

  1. 在附加到请求后,onResponse(response, true) 将被调用以反映任何已经可用的缓存数据。如果数据可用,response.getBitmap() 将不为空。

  2. 网络响应返回后,只会出现以下一种情况:

    • onResponse(response, false) 会在图片被加载时被调用,或者
    • 如果加载图像时出错,将调用onErrorResponse

基于此,有三种可能的响应模式。我已经在一个示例应用程序中测试并确认了这些。

图片从缓存中加载的

在这种情况下会有一个调用:

  • onRespsonse(response, true)会被调用,你可以从response.getBitmap()获取图片。

图片不是从缓存加载的,从网络加载的

在这种情况下会有两个调用:

  • 首先,onRespsonse(response, true) 将被调用,response.getBitmap() 将是 null

  • 然后会调用onRespsonse(response, false),你可以从response.getBitmap()获取图片。

图片不是从缓存加载的,不是从网络加载的

在这种情况下会有两个调用:

  • 首先,onRespsonse(response, true) 将被调用,response.getBitmap() 将是 null

  • 然后,会调用onErrorResponse(error),可以从error(这将是VolleyError的一个实例)中找到错误的详细信息。


在您的情况下,以下代码 sn-p 将帮助您跳过第一个“空”响应:

@Override
public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
    // skip cache failure
    if (isImmediate && response.getBitmap() == null) return;

    // ...
}

希望这有助于弄清楚为什么您的请求可能会收到两个回复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多