6

PhoneGapAndroid でいくつかのネイティブ アクションを作成する方法のテストを開始するために、非常に単純なプラグインを作成しました。

JavaScript:

 function callNativePlugin() {
            cordova.exec(nativePluginResultHandler, nativePluginErrorHandler, "Database", "saveAdvertencia", [ 1, "TesteAdv" ]);
        }

    function nativePluginResultHandler(result) {
        alert("SUCCESS: \r\n" + result);
    }

    function nativePluginErrorHandler(error) {
        alert("ERROR: \r\n" + error);
    }

ジャワ:

@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
    if (action.equals("saveAdvertencia")) {
        advertenciaDS = new AdvertenciaDS(cordova.getActivity());
        callbackContext.sendPluginResult(new PluginResult(Status.OK, new JSONArray("test")));
        return true;
    }
    return false;
}

必要なのは、同じメソッドでアクションから結果を取得する方法です。常に 3 つのメソッド (1 つはアクションを実行するためのもの、1 つは成功アクションを定義するためのもの、1 つはエラー アクションを定義するためのもの) をいつ呼び出すかを実際に制御しない場合、非常に複雑です。PhoneGapアクションが完了した後にそれらを呼び出します。

Android ネイティブ データベースからデータを取得する必要がある場合:

  1. JavaScript で「cordova.exec」を呼び出します。
  2. PhoneGap がプラグインを呼び出します。
  3. プラグインは 2 つのものを返します: すべてが期待どおりに機能したかどうかを定義する PhoneGap のブール値。成功したメソッドに渡されるデータ。
  4. ここが私にとってトリッキーな部分です。成功するかどうかにかかわらず、PhoneGap が決定するため、いつ呼び出されるかを制御できない 2 つのメソッドを作成する必要があります。これを変更するにはどうすればよいですか?
4

3 に答える 3

5

このパターンを使用して、プラグインによって提供される関数のコールバックを 1 つだけにします。

function callNativePlugin(callback) {
   cordova.exec(function(result) {
       callback(null, result);
   }, function(result) {
       callback("myerror");
   }, "Database", "saveAdvertencia", [ 1, "TesteAdv" ])
};

このようにして、最初の引数がエラーで 2 番目が結果である node.js スタイルのコールバックを取得します。

//define the callback function
var callbackFunction = function(err, result) {
    if (err) {
        console.log("there was an error");
    } else {
        console.log("success", result);
    }
};

//call the plugin
callNativePlugin(callbackFunction);

これはコルドバ API によって義務付けられているため、プラグインに 2 つのコールバックを含めることは避けられませんが、プラグイン ユーザーに公開する必要はありません。

于 2013-03-21T21:00:02.767 に答える
2

cordova.exec()非同期呼び出しを、値を返す同期呼び出しに変更する方法を求めている場合、簡単に言えば、できないということです。(長い答えは、ループまたはタイムアウトを使用してそれを偽造することはできますが、すべきではありません。)

Vlad が説明するように、独自のインターフェイスを作成して、呼び出す関数が 1 つだけになるようにすることができますが、私はこの単純なバージョンのようなものを使用します ( http://htmlpresenter.com/api.htmlにあります):

var Database = {
  saveAdvertencia: function(args, callback) {
    cordova.exec(callback,
      function(error) { console.log("Error calling Database.saveAdvertencia: " + error); },
      "Database", "saveAdvertencia", args)
  }
}

結果が必要な場合は、インラインでコールバックを指定して次のように呼び出します。

Database.Advertencia([1, "TesteAdv"], function(result) { alert(result); });

もちろん、結果がまったく必要ない場合は(そうであるように)、このバージョンを使用できます。

function saveAdvertencia() {
  log = function(message) { console.log(message) };
  cordova.exec(log, log, "Database", "saveAdvertencia", arguments);
}

saveAdvertencia(1, "TesteAdv");

(編集:) また、この課題は、より良い質問に関連している可能性があります:

于 2013-08-13T03:57:51.160 に答える
0

JavaScript 内では、簡単に制御できる再帰メソッドを 1 つだけ使用して、PhoneGap プラグインの値を取得できました。

function callNativePlugin(result, error, service, action, json) {
    if (result != null) {
        //alert("SUCCESS: \r\n" + result);
        return result;
    } else if (error != null) {
        //alert("ERROR: \r\n" + error);
        return error;
    }
    return cordova.exec(function(result) {callNativePlugin(result, null, null, null);}, function(error) {callNativePlugin(null, error, null, null);}, service, action, json);
}
于 2013-05-02T20:19:03.303 に答える