javascript
ajax调用java程序,从微信小程序到鸿蒙JS开发-JS调用Java
除輕量級智能穿戴設備,現鴻蒙支持的手機、汽車、TV、手表、平板等屬于富鴻蒙,在JS語言的項目中也有Java模塊,并提供了JS跨語言調用Java方法的技術。現需要實現查看商品評論時,統計出長評、中評和短評的比例,這里將評論數據請求來后調用Java進行計算。
JS調用Java有Ability方式和Internal Ability方式兩種,前者可以被不同的JS方法調用,后者適用于與JS業務邏輯關聯性強,響應時延要求高的服務。這里采用Ability的方式。
1、新建一個Service Ability
在項目工程目錄Java模塊中,右鍵項目的包,New->Ability->Empty Service Ability。
在自動生成的眾多重載方法中,我們需要用到的是onConnect()。此方法在首次連接時回調,并返回IRemoteObject對象,用于后續的業務通信。
因此創建一個內部類,繼承RemoteObject類并實現IRemoteBroker接口。代碼框架如下:
publicclass?ServiceAbility?extends?Ability?{
private?MyRemote?remote?=?new?MyRemote();
@Override
publicIRemoteObject?onConnect(Intent?intent)?{
super.onConnect(intent);
returnremote.asObject();
}
staticclass?MyRemote?extends?RemoteObject?implements?IRemoteBroker?{
MyRemote()?{
super("MyService_MyRemote");
}
MyRemote(String?descriptor)?{
super(descriptor);
}
@Override
publicboolean?onRemoteRequest(intcode,?MessageParcel?data,?MessageParcel?reply,?MessageOptionoption)?{
......
}
@Override
publicIRemoteObject?asObject()?{
returnthis;
}
}
}
主要需實現的兩個方法是onRemoteRequest()和asObject()。在onConnect()方法中返回內部類的示例,asObject()直接返回this即可。onRemoteRequest()是主要需要實現的業務方法,有四個參數:
code:JS端請求時帶來的請求碼,可根據code進行不同的業務處理。
data:JS端請求時帶來的數據,目前僅支持json格式。Java端通過data.readString()獲取請求json字符串。
reply:Java端返回給JS端的數據,目前僅支持String格式,通過reply.writeString(str)寫入返回數據。
option:JS端指定同步或異步方式,Java端通過option.getFlag()獲取。
2、完善代碼邏輯
規定JS端每分頁加載一次評論數據,就將目前頁面中的所有評論內容發送給Java端進行計算。流程和HTTP有一點類似,獲取數據、處理數據、返回數據。鴻蒙提供了ZSONObject可供處理json,完整邏輯代碼如下:
publicclass?ServiceAbility?extends?Ability?{
private?MyRemote?remote?=?new?MyRemote();
@Override
publicIRemoteObject?onConnect(Intent?intent)?{
super.onConnect(intent);
returnremote.asObject();
}
staticclass?MyRemote?extends?RemoteObject?implements?IRemoteBroker?{
private?staticfinalintLIST_COMMENTS?=?200;
private?staticfinalintSUCCESS?=?0;
private?staticfinalintERROR?=?500;
MyRemote()?{
super("MyService_MyRemote");
}
MyRemote(String?descriptor)?{
super(descriptor);
}
@Override
publicboolean?onRemoteRequest(intcode,?MessageParcel?data,?MessageParcel?reply,?MessageOptionoption)?{
Map?result?=?new?HashMap<>(5);
if?(code?==?LIST_COMMENTS)?{
//?獲取并轉化請求數據
String?req?=?data.readString();
WordReq?param?=?ZSONObject.stringToClass(req,?WordReq.class);
List?comments?=?param.getList().stream().filter(e?->?!"用戶未填寫評價內容".equals(e)).collect(Collectors.toList());
//?統計評論字數
intlongComments?=?(int)?comments.stream().mapToInt(String::length).filter(len?->?len?>=?200).count();
intmediumComments?=?(int)?comments.stream().mapToInt(String::length).filter(len?->?len?>=?30?&&?len?
intshortComments?=?(int)?comments.stream().mapToInt(String::length).filter(len?->?len?
//?計算占比
DecimalFormat?df?=?new?DecimalFormat("#.00");
doublelongPer?=?1.0?*?longComments?/?comments.size()?*?100;
doublemediumPer?=?1.0?*?mediumComments?/?comments.size()?*?100;
doubleshortPer?=?1.0?*?shortComments?/?comments.size()?*?100;
//?返回結果
result.put("long",?df.format(longPer)?+"%");
result.put("medium",?df.format(mediumPer)?+"%");
result.put("short",?df.format(shortPer)?+"%");
result.put("code",?SUCCESS);
result.put("msg","ok");
reply.writeString(ZSONObject.toZSONString(result));
returntrue;
}?else{
result.put("code",?ERROR);
result.put("msg","invalid?code");
reply.writeString(ZSONObject.toZSONString(result));
returnfalse;
}
}
@Override
publicIRemoteObject?asObject()?{
returnthis;
}
}
}
3、JS端遠程調用
Java服務部分寫好了,在JS中,鴻蒙提供了FeatureAbility.callAbility()方法用于單次請求Java服務。其參數如下:
bundleName:Ability包名,在config.json中,為app.bundleName。
abilityName:調用服務端Ability類名,可省略包名,直接寫".XxxAbility"。
messageCode:操作碼,和Java端的"code"參數相匹配。
abilityType:Ability類型,0為Ability,1為Internal Ability。
data:請求數據,json類型。
syncOption:與Java端"option"相匹配,0為同步方式,1為異步方式。默認同步方式。
方法返回一個Promise對象,可通過.then()和.catch()處理調用成功和異常。
本例中的方法如下:
//?調用Java統計評論長度
countWords()?{
let?list?=?[];
this.comments.forEach(e?=>?{
list.push(e.content);
})
FeatureAbility.callAbility({
bundleName:?"com.example.litemall",
abilityName:?".ServiceAbility",
messageCode:?200,
abilityType:?0,
data:?{
list
}
}).then(res?=>?{
console.info(res);
let?data?=?JSON.parse(res);
if?(data.code?==?0)?{
this.lengths[0].value?=?data.long;
this.lengths[1].value?=?data.medium;
this.lengths[2].value?=?data.short;
}
}).catch(res?=>?{
console.error(res);
})
}
Java端和JS端的代碼編譯完成并運行,可以看到日志中的返回數據和我們在Java中定義的一致。
運行效果:
但加上Java的部分后,項目編譯的速度明顯變慢了,如下兩步花了很長時間,有沒有大神知道有沒有什么加速的方法?
【編輯推薦】
【責任編輯:jianghua TEL:(010)68476606】
點贊 0
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的ajax调用java程序,从微信小程序到鸿蒙JS开发-JS调用Java的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python-OpenCV 笔记6 --
- 下一篇: Python-OpenCV 笔记7 --