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!