DSBridge实例-在网页中展现Native进度

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

咱们看看点击后的效果:

倒计时

Web端:

<div class="btn" onclick="callProgress()">屡次回调 <span id='progress'></span></div>

 function callProgress(){
      //调用Native提供的callProgress
       dsBridge.call("callProgress", function (value) {
             //显示剩余的时间
             document.getElementById("progress").innerText=value
      })
 }复制代码

Natvie端:

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!

相关文章
相关标签/搜索