正文
2.2.2 js与java之间通信协议的制定
js与java之间的通信特别类似于网络请求,主动发起消息的行为可以称为request(请求消息),对该消息的反馈可以称为response(响应消息)。
request
一个request封装了请求对方的哪个接口,以及该接口所需要的参数。
response
一个response封装了状态信息(可以知道处理的结果是成功还是失败)和处理结果。
如何接收对方发送的response消息?
大家都应该都会想到,在发送消息的时候传递一个回调接口就行了,但是因为js与java之间是跨语言的,尤其是java是不可能把回调接口传递给js,js虽然可以传递过来但是会有问题,所以这时候有一种解决办法:
因此request和response中还得包含回调id这个值。
通信协议的格式
request数据格式:
{
//接口名称
"interfaceName"
:
"test"
,
//回调id值
"callbackId"
:
"c_111111"
,
//传递的参数
"params"
:
{
....
}
}
response数据格式:
{
//回调id,同时这也是response的标志
"responseId"
:
"c_111111"
,
//response数据
"data"
:
{
//状态数据
"status"
:
"1"
,
"msg"
:
"ok"
,
//response的处理结果数据
"values"
:
{
......
}
}
}
到此通信协议就已经定义好了。
2.2.3 让繁琐的无趣的重复的苦力活儿不再有
大家可以看到通信协议request和response都是json格式,从json中解析数据或者把数据封装为json都是重复的苦力活儿。
这也是我一直想着力解决的痛点,解决之道是从retrofit中获得启发的,应用注解来解决以上问题。
关于js与java完美通信的设计思想到此为止,这也是SimpleJavaJsBridge这个库的核心思想,那我们就来看下SimpleJavaJsBridge。
3. SimpleJavaJsBridge
SimpleJavaJsBridge我为什么要起一个这样的名字,首先它
解决了上文中提到的让繁琐的无趣的重复的苦力活儿
不再有的问题,对于不管是从json中解析数据还是把数据封装成json,使用者都不需要关心,让使用者很省心;并且它使用起来也非常的简单,在稍后的例子中大家会体会到,所以用了simple这个词儿。通过它java可以给js发送消息,并且接收js的响应消息;同时js也可以给java发送消息,同样接收java的响应消息。因此它是java与js之间通信的桥梁,因此它的名字叫为SimpleJavaJsBridge。
3.1 如何解决繁琐的无趣的重复的苦力活儿?
解决这个问题思路来自于鼎鼎有名的Retrofit,Retrofit通过注解的方式解决了构建request和解析response的问题,因此注解也可以解决我现在遇到的问题。那我们就来认识下这些注解。
InvokeJSInterface
用来标注java给js发送消息的方法,它的value值代表js提供的功能的接口名字
JavaCallback4JS
用来标注java提供给js的回调方法的
JavaInterface4JS
用来标注java提供给js的接口,它的value值代表功能的接口名字
Param
用来标注参数或者类的实例属性,它的value值代表参数被存入json中的key值,它的needConvert代表当前的参数是否需要进行转换,因为通过JsonObject类往json中存放的数据是有要求的,JsonObject中只能存放基本数据和JsonObject和JsonArray这些数据类型,对于其他的类型就得进行转换了。因此只要是不能直接通过JsonObject存放的类型该值必须为true
ParamCallback
用来标注回调类型的参数,比如发送request给js的方法中,需要有一个回调参数,那这个参数必须用它来标注
ParamResponseStatus
用来标注响应状态类型的参数,比如:statusCode,StatusMsg这些参数,它的value值是json中的key值。
3.2 SimpleJavaJsBridge使用
3.2.1 构建一个SimpleJavaJsBridge实例
SimpleJavaJsBridge
instance
=
new
SimpleJavaJsBridge
.
Builder
()
.
addJavaInterface4JS
(
javaInterfaces4JS
)
.
setWebView
(
webView
)
.
setJSMethodName4Java
(
"_JSBridge._handleMessageFromNative"
)
.
setProtocol
(
"niu"
,
"receive_msg"
).
create
();
通过SimpleJavaJsBridge.Builder来构建一个SimpleJavaJsBridge对象,
-
addJavaInterface4JS用来添加java提供给js的接口
-
setWebView 设置WebView这是必须进行设置的
-
setJSMethodName4Java 设置js为java唯一暴漏的方法名字
-
setProtocol设置协议字段,这也是必须的,这个字段主要是为了ios而设置的
当然还可以调用其他的一些方法对SimpleJavaJsBridge进行设置
3.2.2 java给js提供接口
java给js提供一个无参的接口
/** * 给js发送响应消息的接口*/
public
interface
IResponseStatusCallback
{
void
callbackResponse
(@
ParamResponseStatus
(
"status"
)
int
status
,
@
ParamResponseStatus
(
"msg"
)
String
msg
);
}
//java提供给js的"tes4"接口,@ParamCallback标注的是给js发送消息的回调