我正在开发一个混合应用程序,并尝试根据在webview中执行的javascript函数的返回值在webview的onOverrideUrlLoading中返回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;
}


所以我遇到的问题是,在onOverrideUrlLoading完成将isExternalDomain设置为false的所有行之后,将执行javascript。我想让onOverrideUrlLoading根据javascript返回的值返回true或false。

最佳答案

不幸的是,无法从onOverrideUrlLoading()内部运行JavaScript代码。您必须从onOverrideUrlLoading()返回,然后WebView才能执行其他任何操作。当您从WebView.loadUrl()内部调用onOverrideUrlLoading()时,实际上发生的是将异步任务发布到WebView的消息循环中。仅在离开onOverrideUrlLoading()后才进行处理。因此,当代码在onOverrideUrlLoading()内部时,WebView不会处理任何延迟。

如果要防止基于JavaScript代码的决定进行导航,则使用window.onbeforeunload事件处理程序在JavaScript端执行此操作更为自然。如果从中返回非null值,则通过单击链接进行导航的尝试将被取消。

以下是JavaScript代码示例:

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

关于android - 基于JavaScript返回值的Android onOverrideUrlLoading,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31144038/

10-12 19:42