Aprende a ejecutar un callback de cordova más de una vez en un plugin de Java.

Imaginemos que tienes un tipo de ciclo o algo relacionado que requiere que tu callback de ejecución satisfactoria (success) sea ejecutado más de una vez, por ejemplo el progreso de una descarga que se ejecuta en Java. Si lo has intentado, sabrás que por alguna extraña razon, dicho callback se ejecuta solamente una vez, luego de eso no funciona aunque lo ejecutes cientos de veces.

El problema es conocido de una manera amplia:

// Se ejecuta satisfactoriamente en JavaScript
callbacks.success("somejson");

// Algo más
Boolean something = true;

// Más codigo bla bla
// Este segundo callback normalmente nunca es ejecutado !
callbacks.success("otra cadena de JSON !");

Los callback no se ejecutan porque no mantienes el callback como inactivo, lo que hace que una vez se marque como ejecutado, no se ejecutará nuevamente. Puedes prevenir este comportamiento ejecutando tus callbacks con el siguiente código:

PluginResult resultA = new PluginResult(PluginResult.Status.OK, "miPrimeraCadenaDeJson");
resultA.setKeepCallback(true);
callbacks.sendPluginResult(resultA);

// Más codigo

Boolean something = true;

// bla bla bla codigo

PluginResult resultB = new PluginResult(PluginResult.Status.OK, "miSegundaCadenaDeJson");
resultB.setKeepCallback(true);
callbacks.sendPluginResult(resultB);

En vez de usar nuestros propios callbacks, retornaremos un resultado de plugin. No necesitas importar nada en especial, además de que las clases de cordova estén incluidas claramente.

Cabe destacar que el anterior snippet solo funciona si tu código no es asíncrono, en caso de que necesites ejecutar un callback en módo asíncrono, necesitarás primero retornar algo pero sin respuesta como muestra el siguiente ejemplo:

public boolean execute(String action, JSONArray data, CallbackContext callbackContext) throws JSONException {
   
    // Ejecuta una tarea asíncrona
    cordova.getThreadPool().execute(new Runnable() {
        public void run() {
            // Luego puedes ejecutar un callback más de una vez
            PluginResult resultA = new PluginResult(PluginResult.Status.OK, "miPrimeraCadenaDeJson");
            resultA.setKeepCallback(true);
            callbacks.sendPluginResult(resultA);

            // Más codigo
            
            Boolean something = true;

            // bla bla bla código


            PluginResult resultB = new PluginResult(PluginResult.Status.OK, "miSegundaCadenaDeJson");
            resultB.setKeepCallback(true);
            callbacks.sendPluginResult(resultB);       
        }
    });


    // Mantener callback
    PluginResult pluginResult = new  PluginResult(PluginResult.Status.NO_RESULT); 
    pluginResult.setKeepCallback(true);

    return true;
}

Ingeniero de Software Senior en EPAM Anywhere. Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores