Как выполнить обратный вызов Cordova более одного раза в Java (Android)

Если у вас есть цикл или что-то, что требует, чтобы обратный вызов выполнялся более одного раза (например, процесс загрузки, выполняемый на Java), вы можете заметить, что обратные вызовы после однократного выполнения больше не работают.

Эта проблема хорошо известна:

callbacks.success("somejson"); // Succesfully executed in javascript
// something else
Boolean something = true;
// bla bla bla code !
callbacks.success("anotherJSON!!!"); // This will be never executed!

По какой-то причине обратные вызовы не выполняются, потому что вы не сохраняете обратный вызов (функция готова и больше не должна выполняться).

Вы можете легко решить эту проблему, используя следующий код:

PluginResult resultA = new PluginResult(PluginResult.Status.OK, "myfirstJSONResponse");
resultA.setKeepCallback(true);
callbacks.sendPluginResult(resultA);
// Some more code
Boolean something = true;
// bla bla bla code
PluginResult resultB = new PluginResult(PluginResult.Status.OK, "secondJSONResponse");
resultB.setKeepCallback(true);
callbacks.sendPluginResult(resultB);

Вместо того, чтобы использовать наши обратные вызовы, мы вернем результат плагина, вам не нужно ничего импортировать (очевидно, что нужно импортировать cordova).

Вам нужно использовать предыдущий пример, если ваш код не асинхронный, если вам нужно выполнить обратный вызов в асинхронном режиме, вам сначала нужно вернуть что-то, но без ответа, подобного этому:

public boolean execute(String action, JSONArray data, CallbackContext callbackContext) throws JSONException {
// Execute an asynchronous task
cordova.getThreadPool().execute(new Runnable() {
public void run() {
// Then you're allowed to execute more than twice a callback.
PluginResult resultA = new PluginResult(PluginResult.Status.OK, "myfirstJSONResponse");
resultA.setKeepCallback(true);
callbacks.sendPluginResult(resultA);
// Some more code
Boolean something = true;
// bla bla bla code
PluginResult resultB = new PluginResult(PluginResult.Status.OK, "secondJSONResponse");
resultB.setKeepCallback(true);
callbacks.sendPluginResult(resultB);
}
});
PluginResult pluginResult = new  PluginResult(PluginResult.Status.NO_RESULT);
pluginResult.setKeepCallback(true); // Keep callback
return true;
}
Ссылка на основную публикацию
Adblock
detector