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;
}
Conviertete en un programador más sociable