PhoneGap 1.0.0 - Android 2.1 / 2.3 - Невозможно заставить плагин phonegap работать асинхронно - PullRequest
2 голосов
/ 13 сентября 2011

Что я пытаюсь сделать:

  1. пользователь заполняет данные формы, нажимает кнопку отправить.
  2. пользователю предоставлен загрузочный экран. (Элемент HTML).
  3. Приложение выполняет асинхронный вызов, плагин PhoneGap, который сохраняет эти данные в дБ. Вот в чем проблема, потому что вместо этого вызов синхронный.
  4. Когда приложение html получает обратный вызов, я скрываю экран загрузки.

Из-за синхронного вызова я получил вот что:

  1. пользователь заполняет форму, отправляет
  2. Приложение HTML зависает, данные сохраняются в базе данных.
  3. появляется экран загрузки
  4. вызывается обратный вызов, через несколько миллисекунд после.

Вот некоторый демонстрационный (урезанный) код:

Java:

public class SomePlugin extends Plugin
...
public PluginResult execute(String action, JSONArray data, String callbackId) 
{
    PluginResult result = null;
    //
    // save data in the background...
    //
    Log.d("TAG", "Some Message...");

    result = new PluginResult(Status.OK, "");
    // or 
    // result = new PluginResult(Status.ERROR);

    return result;
}
...
public boolean isSynch(String action) {
     return false; // always do async...
}

JavaScript:

$('#loading-screen').show();

var successCallback = function() {
    console.log('Success Callback');
    $('#loading-screen').hide();
};
var failureCallback = function() {
    console.log('Failed Callback');
    $('#loading-screen').hide();
};

PhoneGap.exec(successCallback, failureCallback, 'PluginName', 'actionName', data);

Из источника PhoneGap:

* Execute a PhoneGap command.  It is up to the native side whether this action is synch or async.
* The native side can return:
*      Synchronous: PluginResult object as a JSON string
*      Asynchrounous: Empty string ""
* If async, the native side will PhoneGap.callbackSuccess or PhoneGap.callbackError,
* depending upon the result of the action.

Так что я подумал, что в этом случае эта строка неверна:

new PluginResult(Status.OK, "");

Примечание. Если wrap (JavaScript) PhoneGap.exec вызывает в setTimeout (например, с задержкой в ​​1 секунду), экран загрузки будет работать «правильно» (он все еще заморожен, но у пользователя есть мгновенная обратная связь), но это явно не так. решение.

Мне кажется, я просто не вижу здесь ничего очевидного, просто один параметр или что-то еще.

Спасибо.

1 Ответ

1 голос
/ 13 сентября 2011

Я думаю, что идеально подходит для AsyncTask просто обработайте ваш dbStorage в doInBackground и обработайте завершение в onPostExcecute (). Вы можете обновить статус в onProgressUpdate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...