Android js异步机制消息处理机制的几种实现

优点:可以实现java和js之间的调用
缺点:apk增加将近7MB: 所用到的资源必须手动释放

2:必须创建运行环境,用完必须释放

3:创建之后,加载写好的js文件,里面包含java可能调用的js方法和一些数据
2:java里面加载js文件的异步任务类:

//将json数据变成字符串 //通过管理器打开文件并读取

3:java里面初始化数据

4:java调用js函数处理,这里因为常用的就几种,所以写了一个公共的工具:

5:js调用java 这个需要在调用之前 在v8里面注册方法名 例如:

//参数1:context 参数2:java方法名,参数三:js里面写的方法名 参数4:方法的参数类型 个数
}

最近在处理android webView与js的通信上的问题,作为总结

//添加js调用android的方法这是关键 前者是个对象,后者是个字符串 在js中是在window.android可以直接获取到 //这是开启js的调试下面再讲 //这个注解可以点击进去看官方描述 是 带有此注释的标记可用于JavaScript代码

  1. 需要在主线程调用才会生效
//此时已在主线程中,可以更新UI了 //当这个回调函数触发了webview才可以发送消息
js与android中的通信还是通过字符串来处理的
 //真正发送给js 的方法 loadurl是异步加载所以如果在web为加载完成发送无效果
 //此时已在主线程中,可以更新UI了

js的封装还没做但是大体是如上

这是他的具体实现 代码不多 其中assets中的js文件是为了注入他的封装的js代码 他的交互方式与上面不同具体实现

//加载自己的js文件 ,然后别人的html调用它的js来传递消息 //callId为键,记录回调的集合 //本地注册一个方法名让js调用 //发送消息的对象,因为webview加载要时间所有他这里先用队里存储 //这就是他处理交互的另一个方式 //这里是是webview加载完成做到的操作 //在当前webview中加载一段自己的js文件

我们观察的他的封装对象和交互方式

然后我们看他的js代码

我们直接看他发送消息的代码
 //这就是message队列 队列的原因后面会将

 //js发送过来的数据分离出来相应的去处理
 //将之前的message都序列出来一次发送到客户端

 

开启后 在chrome浏览器中 输入 然后能找到当前应用有个insert按钮

以上是jsbridge具体实现的思路

}

  • 现在很多App里都内置了Web网页(Hybrid App),比如说很多电商平台,淘宝、京东、聚划算等等,如下图
  • 上述功能是由Android的WebView实现的,其中涉及到Android客户端与Web网页交互的实现
  • 今天我将全面介绍Android通过WebView与JS交互的全面方式


二者沟通的桥梁是WebView

对于Android调用JS代码的方法有2种:

对于JS调用Android代码的方法有3种:


对于Android调用JS代码的方法有2种:

  1. 为了方便展示,本文是采用Andorid调用本地JS代码说明;
  2. 实际情况时,Android更多的是调用远程JS代码,即将加载的JS代码路径改成url即可
// 设置与Js交互的权限 // 设置允许JS弹窗 // 注意调用的JS方法名要对应上 // 由于设置了弹窗检验调用结果,所以需要支持js对话框

特别注意:JS代码调用一定要在 onPageFinished() 回调之后才能调用,否则不会调用。

  • 优点:该方法比第一种方法效率更高、使用更简洁。
  1. 因为该方法的执行不会使页面刷新,而第一种方法(loadUrl )的执行则会。
// 只需要将第一种方法的loadUrl()换成下面该方法即可
 //此处为 js 返回的结果
// 因为该方法在 Android 4.4 版本才可使用,所以使用时需进行版本判断 //此处为 js 返回的结果

对于JS调用Android代码的方法有3种:

// 定义JS需要调用的方法 // 由于对象映射,所以调用test对象等于调用Android映射的对象 // 设置与Js交互的权限

仅将Android对象和JS对象映射即可

  • 缺点:存在严重的漏洞问题,具体请看文章:
  1. 解析该 url 的协议
  2. 如果检测到是预先约定好的协议,就调用相应方法
// 设置与Js交互的权限 // 设置允许JS弹窗 // 步骤1:加载JS代码 // 步骤2:根据协议的参数,判断是否是所需要的url // 一般根据scheme(协议格式) & authority(协议名)判断(前两个参数) // 就解析往下解析参数 // 执行JS所需要调用的逻辑 // 可以在协议上带有参数并传递到Android上
  • 优点:不存在方式1的漏洞;
  • 缺点:JS获取Android方法的返回值复杂。

如果JS想要得到Android方法的返回值,只能通过 WebView 的 loadUrl ()去执行 JS 方法把返回值传递回去,相关的代码如下:

在JS中,有三个常用的对话框方法:

下面的例子将用拦截 JS的输入框(即prompt()方法)说明 :

  1. 常用的拦截是:拦截 JS的输入框(即prompt()方法)
  2. 因为只有prompt()可以返回任意类型的值,操作最全面方便、更加灵活;而alert()对话框没有返回值;confirm()对话框只能返回两种状态(确定 / 取消)两个值
  1. 如果是拦截警告框(即alert()),则触发回调onJsAlert()
// 设置与Js交互的权限 // 设置允许JS弹窗 // 拦截输入框(原理同方式2) // 参数result:代表输入框的返回值 // 根据协议的参数,判断是否是所需要的url(原理同方式2) // 一般根据scheme(协议格式) & authority(协议名)判断(前两个参数) // 就解析往下解析参数 // 执行JS所需要调用的逻辑 // 可以在协议上带有参数并传递到Android上 //参数result:代表消息框的返回值(输入值) // 拦截JS的警告框 // 拦截JS的确认框
    上述所有代码均存放在:

2.2.2 三种方式的对比 & 使用场景


  • 本文主要对Android通过WebView与JS的交互方式进行了全面介绍
  • 关于 WebView 的系列文章希望会对你有所帮助:

  • 接下来我会继续讲解其他安卓开发的知识,有兴趣可以继续关注!!!!


请点赞!因为你们的赞同/鼓励是我写作的最大动力!


不定期分享关于安卓开发的干货,追求短、平、快,但却不缺深度

}

我要回帖

更多关于 js异步机制 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信