这完全取决于你.您只需要从注入的方法立即返回,但能够在执行完成时调用JS代码.像这样的东西(注意它只是一个粗略的草图):
private WebView mWebView;
private final Object mLock = new Object();
private String mJsCallbackCode;
@JavascriptInterface
public void someMethod(String jsCallbackCode) {
synchronized (mLock) {
mJsCallbackCode = jsCallbackCode;
}
// Start some business logic asynchronously, and return back here immediately.
return;
}
public void onBusinessLogicCompleted(bool success) {
String jsCallbackCode;
synchronized (mLock) {
jsCallbackCode = mJsCallbackCode;
}
mWebView.loadUrl("javascript:" + jsCallbackCode + "(" + success + ");void(0);");
}
在JavaScript中,您可以像这样使用它:
function callSomeMethod(callback) {
window._someMethodCallback = callback;
someService.someMethod(
'(function(success){' +
' if (success) window._someMethodCallback();' +
' delete window._someMethodCallback;' +
'})'
);
};
所以我的想法是你传递需要作为字符串回调的JS代码(因为你无法传递真正的JS对象).此代码将在全局上下文中调用.
需要锁定Java,因为从JS调用的方法在专用线程上运行,而不是在应用程序的UI线程上运行.
请注意,在M预览版中,已将一个用于postMessage的API添加到WebView中,从而可以在Java和JS代码之间发布异步消息.