3

Is it possible for arbitrary functional objects in js to be passed to Java side, so java can call that js object? (a callback)

for example, (access is a function that already registered to call a Java function)

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

Are there any great techniques that can deal with anonymous callback function in java?

4
  • var cannot be passed. Check for primitive types Commented Dec 26, 2011 at 2:38
  • what`s mean, @NikolaDespotoski ? is there some bypass style? Commented Dec 26, 2011 at 2:46
  • Try to pass data using JSON string instead returning arbitrary var object.... Commented Dec 26, 2011 at 2:49
  • So, js user can`t use closure concept for custom js ? Commented Dec 26, 2011 at 3:12

1 Answer 1

4

You just need some sort of key to reference your individual callback anonymous function. I think this is how jsonp is used sometimes too.

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
   }
}

Java:

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

Using this from Javascript:

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

TestCallback('lalala', onSuccess, null);
Sign up to request clarification or add additional context in comments.

3 Comments

This is something that should be built into XWalk somehow. This is very handy.
Java : xwalk.post(new Runnable(){ @Override public void run(){ xwalk.evaluateJavascript("(function(){ AndroidStatic.callBack(" + "\"" + result + "\"" + "); })();", null); } });
Javascript : var AndroidStatic = { callBack: function (result) { //alert(result); console.log(result); } };

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.