2011-12-26 2 views
2

Возможно ли, чтобы произвольные функциональные объекты в js были переданы на сторону Java, поэтому java может вызвать этот объект js? (Обратный вызов)Передача функции js callback как параметра в Java addJavascriptInterface

, например, (доступ к функции, которая уже зарегистрирована для вызова функции Java)

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

Существуют ли какие-либо большие методы, которые могут иметь дело с анонимной функцией обратного вызова в Java?

+0

'var' не может быть принят. Проверьте на примитивные типы –

+0

что значит, @NikolaDespotoski? есть ли стиль обхода? –

+0

Попробуйте передать данные с использованием строки JSON вместо возвращаемого произвольного объекта var .... –

ответ

2

Вам просто нужен какой-то ключ для ссылки на вашу анонимную функцию обратного вызова. Я думаю, что так иногда используется 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 
    } 
} 

Java:

@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); 
+0

Это то, что должно быть встроено в XWalk. Это очень удобно. – Todd

+0

Java: xwalk.post (новый Runnable() { @Override общественности недействительным запуска() { xwalk.evaluateJavascript ("(функция() {AndroidStatic.callBack (" + "\"»+ результат + "\" "+");})(); ", null); } }); – cho

+0

Javascript: var AndroidStatic = { callBack: function (result) { // alert (result); console.log (результат); } }; – cho

Смежные вопросы