2011-12-26 11 views
2

js内の任意の機能オブジェクトをJava側に渡すことができるため、Javaがそのjsオブジェクトを呼び出すことはできますか? (コールバック)jsコールバック関数をパラメータとしてJava addJavascriptInterfaceに渡す

例えば、(アクセスはすでにJava関数を呼び出すために登録された関数である)

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

Javaで匿名コールバック関数を扱うことができるすべての偉大な技術はありますか?

+0

'var'を渡すことはできません。プリミティブ型を確認する –

+0

何を意味するのか、@NikolaDespotoski?いくつかのバイパススタイルはありますか? –

+0

代わりに任意のvarオブジェクトを返す代わりに、JSON文字列を使ってデータを渡そうとしています.... –

答えて

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

ジャワ:JavaScriptからこれを使用する

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

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

TestCallback('lalala', onSuccess, null); 
+0

これは何とかXWalkに組み込むべきものです。これはとても便利です。 – Todd

+0

のJava:xwalk.post(新しいRunnableを(){@Override ます。public void実行(){ xwalk.evaluateJavascript( "(関数(){AndroidStatic.callBack(" + "\"」+結果+ "\" "+");})(); "、null); } }); – cho

+0

Javascript:var AndroidStatic = { コールバック:関数(結果){ //アラート(結果); console.log(結果); } }; – cho

関連する問題