Volley,ImageLoader.ImageListener中的onResponse调用了多少次

L. *_*ter 4 android android-intent android-volley

我' 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...");
                }
            });
Run Code Online (Sandbox Code Playgroud)

"成功"日志打印两次.

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

Mar*_*her 10

我在文档中ImageLoader.java找到了答案.文件说明:

呼叫流程如下:

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

  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)中找到错误的细节.


在您的情况下,以下代码段将帮助您跳过第一个"空"响应:

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

    // ...
}
Run Code Online (Sandbox Code Playgroud)

希望这有助于澄清为什么您可能会收到两个对您的请求的回复.