Android 截击,ImageLoader.ImageListener中的onResponse调用了多少次

Android 截击,ImageLoader.ImageListener中的onResponse调用了多少次,android,android-intent,android-volley,Android,Android Intent,Android Volley,我正在使用截击进行互联网请求。我认为当收到响应时,onResponse方法应该只调用一次,但我发现它调用了两次 这是我的密码: YVolley.getInstance(context).getImageLoader().get(category.child.get(i).icon, new ImageLoader.ImageListener() { @Override public void onResponse(ImageLoad

我正在使用
截击
进行互联网请求。我认为当收到响应时,
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...");
                }
            });
“成功”日志打印两次


我的代码是否有问题,或者应该是这样的?

我在中找到了答案。文件规定:

调用流程如下所示:

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

  • 网络响应返回后,仅会发生以下情况之一:

    • onResponse(response,false)
      将在加载映像时调用,或者
    • 如果加载图像时出错,将调用
      onErrorResponse
  • 基于此,有三种可能的反应模式。我已经在一个示例应用程序中测试并确认了这些

    图像从缓存中加载 在这种情况下,将有一个呼叫:

    • onresponse(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;
    
        // ...
    }
    


    希望这有助于澄清为什么您的请求可能会得到两个响应。

    第一个响应可能来自缓存请求