尊重原创: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)   

更多相关文章

  1. Android(安卓)处理空列表的方法(必看篇)
  2. TextView设置android:ellipsize="marquee"属性,无法实现跑马灯效
  3. android当方法数超过64k时(android studio)
  4. android CursorAdapter的监听事件
  5. android中的数据存取-方式二:file(文件)
  6. Android菜单的几种方法
  7. Android注解式绑定控件
  8. android 判断是白天还是晚上,然后设置地图模式
  9. 从源代码编译Android(CyanogenMod For Hero GSM)【转】

随机推荐

  1. Android(Java) GMT时间转换
  2. Android(安卓)开发之 ---- 底层驱动开发(
  3. 【可能有点用的记录】Android(安卓)Studi
  4. android完全退出应用程序
  5. android 丛书
  6. GET Android(安卓)摸拟器 IP.
  7. Android(安卓)复习笔记之图解TextView类
  8. android:configChanges="orientation|key
  9. Android各个版本API的区别
  10. [Android(安卓)Pro] 注册 Google Play 开