如何从webView,Android中的@JavascriptInterface方法调用Javascript?

KaK*_*aKa 3 javascript java android webview

这是我的HTML页面代码:

<script>
    function native_callback() {
        alert("Test")
    }
</script>
<button onclick='native.appVersion()'>appVersion</button>
Run Code Online (Sandbox Code Playgroud)

如您所见,只有一个按钮,当我单击按钮时,它将调用@JavascriptInterface方法appVersion().我想要做的是native_callback()appVersion()方法中调用javascript函数.不幸的是,我会抓住一个java异常.

这是我的WebView类的java源代码的一部分:

... // some other codes that not related

getSettings().setJavaScriptEnabled(true);
addJavascriptInterface(new InJavaScriptLocalObj(), "native");

... // some other codes that not related

final class InJavaScriptLocalObj {
@JavascriptInterface
    public void appVersion() {
        Log.i("JsInterface","Called!")
        loadUrl("javascript:native_callback()");
    }
}
Run Code Online (Sandbox Code Playgroud)

而且,我可以从网页上捕获异常:

Uncaught Error: Java exception was raised during method invocation -- From line 6 of http://my web page url

第6行是<button onclick='native.appVersion()'>appVersion</button>.

顺便说一下,鳕鱼Log.i("JsInterface","Called!")已被召唤,我可以看到日志.

我该怎么办 ?

解决方案 实际上,它必须在另一个线程中调用,但与WebView对象相同.这是我的代码:

web_view.post(new Runnable() {
        @Override
        public void run() {
            web_view.loadUrl("javascript:native_callback()");
        }
    });
Run Code Online (Sandbox Code Playgroud)

小智 6

如何使用处理程序?我检查它在我的项目中运作良好.

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        loadUrl("javascript:native_callback()");
    }
}, 0);
Run Code Online (Sandbox Code Playgroud)