Volley, ¿Cuántas veces la onResponse en ImageLoader.ImageListener llamada

Yo uso Volley para hacer peticiones de Internet. Creo que el método onResponse debe ser llamado sólo una vez cuando reciben una respuesta, pero he encontrado que se llama dos veces.

Aquí está mi código:

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

El "éxito" Log impreso dos veces.

¿Hay algo mal con mi código o debería ser así?

He encontrado la respuesta a esto en la documentación de ImageLoader.java . La documentación establece:

El flujo de llamadas es el siguiente:

  1. Al ser conectado a una solicitud, onResponse(response, true) se invocará para reflejar los datos almacenados en caché que ya estaban disponibles. Si los datos estuvieran disponibles, response.getBitmap() no será nulo.

  2. Después de que una respuesta de red devuelve, sólo ocurrirá uno de los casos siguientes:

    • onResponse(response, false) será llamada si la imagen fue cargada, o
    • onErrorResponse se llamará si se produjo un error al cargar la imagen.

Sobre la base de esto hay tres patrones de posibles respuestas. He probado y confirmado estos en una aplicación de ejemplo.

La imagen se carga desde la caché

En este caso habrá una llamada:

  • onRespsonse(response, true) será llamado, y usted puede obtener la imagen de response.getBitmap() .

La imagen no se carga desde la caché y se carga desde la red

En este caso habrá dos llamadas:

  • Primero, onRespsonse(response, true) será llamado, y response.getBitmap() será null .

  • Entonces, onRespsonse(response, false) será llamado, y usted puede conseguir la imagen de response.getBitmap() .

La imagen no se carga desde la memoria caché y no se carga desde la red

En este caso habrá dos llamadas:

  • Primero, onRespsonse(response, true) será llamado, y response.getBitmap() será null .

  • A continuación, onErrorResponse(error) será llamado y los detalles del error se pueden encontrar desde error (que será una instancia de VolleyError ).


En su caso, el siguiente fragmento de código le ayudará a omitir la primera respuesta "vacía":

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

Esperemos que esto ayude a aclarar por qué usted puede estar recibiendo dos respuestas a su solicitud.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.