2

js 内の任意の機能オブジェクトを Java 側に渡して、java がその js オブジェクトを呼び出せるようにすることはできますか? (コールバック)

たとえば、(access は、Java 関数を呼び出すために既に登録されている関数です)

access(function(blabla){
    ...
});

Javaで匿名コールバック関数を処理できる優れたテクニックはありますか?

4

1 に答える 1

3

個々のコールバック匿名関数を参照するには、何らかのキーが必要です。これはjsonpも時々使われる方法だと思います。

Javascript:

var callbacks = [];
function registerCallback(callback)
{
   callbacks.push(callback);
   return callbacks.length - 1;
}

function getCallback(index)
{
   var callback = callbacks[index];
   callbacks[index] = null;

   TryGCCallbacks();

   return callbacks;
}

//The array index positions must be preserved, but when it's empty, we should restart the array so it doesn't grow forever
function TryGCCallbacks()
{
   var isCallbackRemaining = false;
   for (var i = 0; i < callbacks.length; i++)
   {
      if (callbacks[i] == null) {
         continue;
      }

      isCallbackRemaining = true;
      break;
   }
   if (isCallbackRemaining == false)
   {
      callbacks = []; //reset
   }
}

ジャワ:

@org.xwalk.core.JavascriptInterface
public String TestCallback(String someData, String onSuccess, String onError){
   xwalk.evaluateJavascript("getCallback(" + onSuccess + ")('success');", null);
}

Javascript からこれを使用する:

var onSuccess = registerCallback(function(r) {
   console.log(r);
});

TestCallback('lalala', onSuccess, null);
于 2016-11-15T00:47:21.590 に答える