我使用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。文档指出:
调用流程是这样的:
附加到请求后,onResponse(response, true)
将被调用以反映任何已经可用的缓存数据。如果有数据的话,response.getBitmap()
将是非空的。
-
网络响应返回后,只会出现以下情况之一:
-
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(使用前将#替换为@)