Android onOverrideUrlLoading 基于 javascript return 值

Android onOverrideUrlLoading based on javascript return value

我正在开发混合应用程序,并尝试根据在 webview 中执行的 javascript 函数的 returned 值 return 在 webview 的 onOverrideUrlLoading 中 return true 或 false

我目前的示例代码。

//Have a boolean variable isExternalDomain; 
//Added JavascriptInterface webView.addJavascriptInterface(this, "android");

public boolean onOverrideUrlLoading(final String url) {


WebView.loadUrl("javascript:android.onData('true')");

//I Tried inserting sleep, delay EG: Thread.sleep(200); 


//I see the delay but still javascript executes last.

if(isExternalDomain) {
 return true;
 } else {
 return false;
 }

}

@JavascriptInterface public void onData(String value)
 {   
 isExternalDomain = true; 
}

所以我遇到的问题是 javascript 执行发生在 onOverrideUrlLoading 完成执行所有 isExternalDomain 为 false 的行之后。我想让 onOverrideUrlLoading returning true 或 false 基于 javascript returned 值。

不幸的是,运行 JavaScript 代码来自 onOverrideUrlLoading() 是不可能的。在 WebView 可以执行任何其他操作之前,您必须从 onOverrideUrlLoading() return。当您从 onOverrideUrlLoading() 内部调用 WebView.loadUrl() 时,真正发生的是一个异步任务被发布到 WebView 的消息循环中。它只会在您离开 onOverrideUrlLoading() 后得到处理。因此,当您的代码在 onOverrideUrlLoading().

中时,再多的延迟也不会使 WebView 处理您的请求

如果您想根据 JavaScript 代码做出的决定阻止导航发生,在 JavaScript 端使用 window.onbeforeunload 事件处理程序更自然。如果您 return 来自它的非 null 值,将取消通过单击 link 导航离开的尝试。

下面是 JavaScript 代码的示例:

window.onbeforeunload = function() {
    if (navigationDisallowed()) {
        return true;  // Prevent navigating away from the page.
    } else {
        return null;  // Allow navigating away.
    }
}