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

2023-12-10

我使用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...");
                }
            });

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

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


我在其中找到了答案的文档ImageLoader.java。文档指出:

调用流程是这样的:

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

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

    • onResponse(response, false)如果图像已加载,则将被调用,或者
    • onErrorResponse如果加载图像时出错,将被调用。

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

图片is从缓存加载

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

  • onRespsonse(response, true)将被调用,您可以从中获取图像response.getBitmap().

图像是not从缓存加载,以及is从网络加载的

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

  • First, onRespsonse(response, true)将被调用,并且response.getBitmap()null.

  • Then, onRespsonse(response, false)将被调用,您可以从中获取图像response.getBitmap().

图片is not从缓存加载,以及is not从网络加载的

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

  • First, onRespsonse(response, true)将被调用,并且response.getBitmap()null.

  • Then, onErrorResponse(error)将被调用,错误的详细信息可以从error(这将是一个实例VolleyError).


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

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

    // ...
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Volley,ImageLoader.ImageListener中的onResponse调用了多少次 的相关文章

随机推荐