DSBridge是目前地球上使用最簡單并且支持同步調(diào)用的跨平臺(IOS/Android)javascript bridge(native和js的橋梁)狱意,DSBridge 2.0更新之后,支持了“native多次返回”,極大的方便了js調(diào)用native方法時久又,natvie需要多次向js返回數(shù)據(jù)的場景。
先貼出DSBridge github地址
DSBridge-IOS:https://github.com/wendux/DSBridge-IOS
DSBridge-Android:[https://github.com/wendux/DSBridge-Android
“多次返回”是什么豆励?
通常情況下拳芙,調(diào)用一個方法結(jié)束后會返回一個結(jié)果,是一一對應的埂息,現(xiàn)在技潘,我們來思考如下場景:
有一個嵌入到app中,顯示文檔下載列表的網(wǎng)頁千康。要求當點擊網(wǎng)頁中的相應文件對應的下載按鈕后享幽,開始下載文件,并在該文件顯示項的底部顯示下載進度拾弃。
思考:我們將文件下載的功能在natvie端實現(xiàn)值桩,當點擊網(wǎng)頁上的某項時,我們通過js調(diào)用native的下載方法豪椿,native在下載的過程中奔坟,不斷的向js返回進度, 然后js更新網(wǎng)頁上的進度條斯入,等到下載任務結(jié)束時,才算本次調(diào)用結(jié)束蛀蜜。而這種調(diào)用的特征就是js的一次調(diào)用刻两,對應native的“多次返回”,考慮到native很多耗時任務都可能會多次返回(比如返回進度)滴某,DSBridge 2.0對“多次返回”進行了支持磅摹,使用DSBridge 就可以非常方便的應對這種case了了。
示例
我們來模擬一個調(diào)用計時器的功能:
Native:提供一個倒計時的API, 命名為callProgress, 它的功能是起動一個計時器霎奢,倒計時10秒户誓,每過一秒向js輸出剩余的時間。
JS: 調(diào)用native提供的倒計時API幕侠,將剩余時間(秒)更新到網(wǎng)頁帝美。
我們看看點擊后的效果:
Web端:
<div class="btn" onclick="callProgress()">多次回調(diào) <span id='progress'></span></div>
function callProgress(){
//調(diào)用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) {
// 返回剩余的時間,會多次調(diào)用
handler.setProgressData((i--)+"");
}
@Override
public void onFinish() {
//結(jié)束調(diào)用
handler.complete("");
}
}.start();
}
注:setProgressData可以多次調(diào)用晤硕,每調(diào)用一次悼潭,js端就會收到一次數(shù)據(jù)。complete調(diào)用之后則代表本次調(diào)用結(jié)束舞箍,handler將失效舰褪,調(diào)用complete之后將不能再調(diào)用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){
//返回剩余的時間占拍,可多次調(diào)用
hanlder([NSString stringWithFormat:@"%d",value--],NO);
}else{
//結(jié)束調(diào)用
hanlder(@"",YES);
[timer invalidate];
}
}
...
注:
handler(NSString * _Nullable result,BOOL complete)
result: 返回給js的數(shù)據(jù)。
complete:表示調(diào)用是否結(jié)束捎迫;complete為YES, 調(diào)用之后則代表本次調(diào)用結(jié)束晃酒,handler將失效。
完整的示例請參考DSBridge自帶的demo:
DSBridge-IOS:https://github.com/wendux/DSBridge-IOS
DSBridge-Android:https://github.com/wendux/DSBridge-Android
最后
如果你喜歡DSBridge , 歡迎star!