DSBridge是目前地球上使用最简单而且支持同步调用的跨平台(IOS/Android)javascript bridge(native和js的桥梁),DSBridge 2.0更新以后,支持了“native屡次返回”,极大的方便了js调用native方法时,natvie须要屡次向js返回数据的场景。javascript
先贴出DSBridge github地址java
DSBridge-IOS:github.com/wendux/DSBr…git
DSBridge-Android:[github.com/wendux/DSBr…github
一般状况下,调用一个方法结束后会返回一个结果,是一一对应的,如今,咱们来思考以下场景:web
有一个嵌入到app中显示文档下载列表的网页。要求点击网页中相应文件对应的下载按钮后,开始下载文件,并在该文件显示项的底部显示下载进度。objective-c
思考:咱们将文件下载的功能在natvie端实现,当点击网页上的某项时,咱们经过js调用native的下载方法,native在下载的过程当中,不断的向js返回进度, 而后js更新网页上的进度条,等到下载任务结束时,才算本次调用结束。而这种调用的特征就是js的一次调用,对应native的“屡次返回”,考虑到native不少耗时任务均可能会屡次返回(好比返回进度),DSBridge 2.0对“屡次返回”进行了支持,使用DSBridge 就能够很是方便的应对这种case了了。json
咱们来模拟一个调用计时器的功能:app
Native:提供一个倒计时的API, 命名为callProgress, 它的功能是起动一个计时器,倒计时10秒,每过一秒向js输出剩余的时间。ide
JS: 调用native提供的倒计时API,将剩余时间(秒)更新到网页。ui
咱们看看点击后的效果:
<div class="btn" onclick="callProgress()">屡次回调 <span id='progress'></span></div>
function callProgress(){
//调用Native提供的callProgress
dsBridge.call("callProgress", function (value) {
//显示剩余的时间
document.getElementById("progress").innerText=value
})
}复制代码
Android
@JavascriptInterface
public void callProgress(JSONObject jsonObject, final CompletionHandler handler) throws JSONException {
new CountDownTimer(11000, 1000) {
int i=10;
@Override
public void onTick(long millisUntilFinished) {
// 返回剩余的时间,会屡次调用
handler.setProgressData((i--)+"");
}
@Override
public void onFinish() {
//结束调用
handler.complete("");
}
}.start();
}复制代码
注:setProgressData能够屡次调用,每调用一次,js端就会收到一次数据。complete调用以后则表明本次调用结束,handler将失效,调用complete以后将不能再调用setProgressData。
IOS
//下面代码中value、handler为全局变量
- ( void )callProgress:(NSDictionary *) args :(void (^)(NSString * _Nullable result,BOOL complete))completionHandler
{
value=10;
//保存handler
hanlder=completionHandler;
//起动计时器
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(onTimer:) userInfo:nil repeats:YES];
}
-(void)onTimer:t{
if(value!=-1){
//返回剩余的时间,可屡次调用
hanlder([NSString stringWithFormat:@"%d",value--],NO);
}else{
//结束调用
hanlder(@"",YES);
[timer invalidate];
}
}
...复制代码
注:
handler(NSString * _Nullable result,BOOL complete)
result: 返回给js的数据。
complete:表示调用是否结束;complete为YES, 调用以后则表明本次调用结束,handler将失效。
完整的示例请参考DSBridge自带的demo:
DSBridge-IOS:github.com/wendux/DSBr…
DSBridge-Android:github.com/wendux/DSBr…
若是你喜欢DSBridge , 欢迎star!