Android - webview通过js调用Android方法

尊重原创:https://blog.csdn.net/nihaomabmt/article/details/80347945


H5调用APP的方法——APP来实现一些功能

1、通过下面的方法将webview的接口传给H5

  1.  @param object the Java object to inject into this WebView's JavaScript  
  2. * @param name the name used to expose the object in JavaScript  
  3. webview.addJavascriptInterface(Object object, String name)); 
在项目中

webview.addJavascriptInterface(new JsAction(), "action");
2、在JsAction类中添加相应的接口方法

android原生提供了一种注解方式@JavascriptInterface。只要在JsAction的类里面定义的方法都加上@JavascriptInterface即可。

  1. private class JsAction {  
  2.   
  3.        @JavascriptInterface //H5调用Android的该方法  
  4.        public void toast(final String jsonString) {  
  5.            //注意@JavascriptInterface 下的该方法和当前activity并不是同一个线程,所以增加要将H5的调用和回调到H5的代码都写到runOnUiThread。否则会抛出以下异常  
  6.            runOnUiThread(new Runnable() {  
  7.               @Override  
  8.              public void run() {  
  9.            JSONObject object = null;  
  10.            try {  
  11.                object = new JSONObject(jsonString);  
  12.            } catch (JSONException e) {  
  13.                e.printStackTrace();  
  14.            }  
  15.            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);  
  16.            builder.setTitle("H5调用Android显示对话框");  
  17.            if (object != null) {  
  18.                builder.setMessage(object.optString("message"""));  
  19.            }  
  20.            builder.setNegativeButton(android.R.string.ok, null);  
  21.            AlertDialog dialog = builder.create();  
  22.            dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {  
  23.                @Override  
  24.                public void onDismiss(DialogInterface dialog) {  
  25.                    //在dialog消息的时候,将修改H5的内容  
  26.                    reloadJs("alert""iOS change javascript to message for H5");  
  27.                }  
  28.            });  
  29.            dialog.show();  
  30.               }  
  31.             });  
  32.   
  33.   
  34.        }  
  35.    }  

在H5调用的方法中添加如下代码即可

[javascript]  view plain  copy
  1. //H5调用Android的方法来显示dialog  
  2. function toast(){  
  3.     window.action.toast("{\"message\":\"From H5 message\"}");  
  4. }  

@JavascriptInterface 下的该方法和当前activity并不是同一个线程,所以增加要将H5的调用和回调到H5的代码都写到runOnUiThread。否则会抛出以下异常

[java]  view plain  copy
  1. 05-17 16:11:00.847 13875-14010/com.j1 E/AndroidRuntime: FATAL EXCEPTION: JavaBridge  
  2.     Process: com.j1, PID: 13875  
  3.     java.lang.RuntimeException: java.lang.Throwable: A WebView method was called on thread 'JavaBridge'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 2) {839b89} called on Looper (JavaBridge, tid 349) {a0a3877}, FYI main Looper is Looper (main, tid 2) {839b89})  
  4.         at android.webkit.WebView.checkThread(WebView.java:2486)  
  5.         at android.webkit.WebView.loadUrl(WebView.java:938)  
  6.         at com.j1.MainActivity.reloadJs(MainActivity.java:89)  
  7.         at com.j1.MainActivity.access$100(MainActivity.java:18)  
  8.         at com.j1.MainActivity$JsAction$1.onDismiss(MainActivity.java:76)  
  9.         at android.app.Dialog$ListenersHandler.handleMessage(Dialog.java:1361)  
  10.         at android.os.Handler.dispatchMessage(Handler.java:105)  
  11.         at android.os.Looper.loop(Looper.java:164)  
  12.         at android.os.HandlerThread.run(HandlerThread.java:65)  
  13.      Caused by: java.lang.Throwable: A WebView method was called on thread 'JavaBridge'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 2) {839b89} called on Looper (JavaBridge, tid 349) {a0a3877}, FYI main Looper is Looper (main, tid 2) {839b89})  
  14.         at android.webkit.WebView.checkThread(WebView.java:2476)  
  15.         at android.webkit.WebView.loadUrl(WebView.java:938)   
  16.         at com.j1.MainActivity.reloadJs(MainActivity.java:89)   
  17.         at com.j1.MainActivity.access$100(MainActivity.java:18)   
  18.         at com.j1.MainActivity$JsAction$1.onDismiss(MainActivity.java:76)   
  19.         at android.app.Dialog$ListenersHandler.handleMessage(Dialog.java:1361)   
  20.         at android.os.Handler.dispatchMessage(Handler.java:105)   
  21.         at android.os.Looper.loop(Looper.java:164)   
  22.         at android.os.HandlerThread.run(HandlerThread.java:65)   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值