このようなことをする必要があるときは、次のような基板レイヤーを使用します。
JavaScript
(function() {
var callbacks = {};
function getNewId() {
return Math.round(Math.random() * 999999999);
}
window.__withCallback = function(func, context, callback, params) {
var cbId = getNewId(),
args = Array.prototype.slice.call(arguments, 2);
while (cbId in callbacks) {
cbId = getNewId();
}
args.unshift(cbId);
callbacks[cbId] = { context: context, callback: callback };
func.apply(Native, args);
};
window.__callbackFromNative = function(id, params) {
var args,
cbItem = callbacks[id];
if (cbItem && typeof(cbItem.callback) === 'function') {
args = Array.prototype.slice.call(arguments, 1);
cbItem.callback.apply(cbItem.context, args);
}
delete callbacks[id];
};
}());
したがって、次のようなJavaコードがある場合(「ネイティブ」と同じオブジェクトを公開したと仮定):
ジャワ
class Native {
public void test (long callbackId, String param1, String param2) {
// do java stuff in here
// webView is your webView
webView.loadUrl("javascript:__callbackFromNative(" + callbackId + ", 'yay', 69)");
}
}
次のように使用します。
JavaScript
var awesome = {
test2: function(arg1, arg2) {
// callback
},
startTest: function() {
// here's the way you pass "this" to "Native.test",
// this.test2 is the function you want to "callback" to
// the rest are all params
__withCallback(Native.test, this, this.test2, "xxx", 'yay');
}
};
awesome.startTest();
基板レイヤーは再利用可能で標準になっているため、グローバル変数の設定やそのようなクレイジーなことを心配する必要はありません。さらに、ネイティブレイヤーの内外の任意の数の引数で機能します...
これが役立つことを願っています -ck