2011-12-26 442 views
2

是否有可能將js中的任意函數對象傳遞給Java端,因此java可以調用該js對象? (回調)將js回調函數作爲參數傳遞給Java addJavascriptInterface

例如,(訪問是已經註冊調用Java函數的函數)

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

是否有可以處理Java中的匿名回調函數任何偉大的技術?

+0

'var'無法通過。檢查原始類型 – 2011-12-26 02:38:23

+0

是什麼意思,@NikolaDespotoski?有一些旁路樣式嗎? – 2011-12-26 02:46:26

+0

嘗試使用JSON字符串傳遞數據,而不是返回任意var對象.... – 2011-12-26 02:49:24

回答

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 2016-11-15 01:29:13

+0

的Java:xwalk.post(新的Runnable(){@Override 公共 無效的run(){ xwalk.evaluateJavascript( 「(函數(){AndroidStatic.callBack(」 + 「\」」 +結果+ 「\」 「+」);})();「,null); } }); – cho 2016-11-15 16:05:12

+0

Javascript:var AndroidStatic = { callBack:function(result){ // alert(result); console.log(result); } }; – cho 2016-11-15 16:05:36