日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
從微信小程序到鴻蒙JS開(kāi)發(fā)-JS調(diào)用Java

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站制作、做網(wǎng)站、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)推出湯旺免費(fèi)做網(wǎng)站回饋大家。

和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.

除輕量級(jí)智能穿戴設(shè)備,現(xiàn)鴻蒙支持的手機(jī)、汽車(chē)、TV、手表、平板等屬于富鴻蒙,在JS語(yǔ)言的項(xiàng)目中也有Java模塊,并提供了JS跨語(yǔ)言調(diào)用Java方法的技術(shù)。現(xiàn)需要實(shí)現(xiàn)查看商品評(píng)論時(shí),統(tǒng)計(jì)出長(zhǎng)評(píng)、中評(píng)和短評(píng)的比例,這里將評(píng)論數(shù)據(jù)請(qǐng)求來(lái)后調(diào)用Java進(jìn)行計(jì)算。

JS調(diào)用Java有Ability方式和Internal Ability方式兩種,前者可以被不同的JS方法調(diào)用,后者適用于與JS業(yè)務(wù)邏輯關(guān)聯(lián)性強(qiáng),響應(yīng)時(shí)延要求高的服務(wù)。這里采用Ability的方式。

1、新建一個(gè)Service Ability

在項(xiàng)目工程目錄Java模塊中,右鍵項(xiàng)目的包,New->Ability->Empty Service Ability。

在自動(dòng)生成的眾多重載方法中,我們需要用到的是onConnect()。此方法在首次連接時(shí)回調(diào),并返回IRemoteObject對(duì)象,用于后續(xù)的業(yè)務(wù)通信。

因此創(chuàng)建一個(gè)內(nèi)部類,繼承RemoteObject類并實(shí)現(xiàn)IRemoteBroker接口。代碼框架如下:

 
 
 
 
  1. public class ServiceAbility extends Ability {
  2.     private MyRemote remote = new MyRemote();
  3.     @Override
  4.     public IRemoteObject onConnect(Intent intent) {
  5.         super.onConnect(intent);
  6.         return remote.asObject();
  7.     }
  8.     static class MyRemote extends RemoteObject implements IRemoteBroker {
  9.         MyRemote() {
  10.             super("MyService_MyRemote");
  11.         }
  12.         MyRemote(String descriptor) {
  13.             super(descriptor);
  14.         }
  15.         @Override
  16.         public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) {
  17.             ......
  18.         }
  19.         @Override
  20.         public IRemoteObject asObject() {
  21.             return this;
  22.         }
  23.     }
  24. }

主要需實(shí)現(xiàn)的兩個(gè)方法是onRemoteRequest()和asObject()。在onConnect()方法中返回內(nèi)部類的示例,asObject()直接返回this即可。onRemoteRequest()是主要需要實(shí)現(xiàn)的業(yè)務(wù)方法,有四個(gè)參數(shù):

  • code:JS端請(qǐng)求時(shí)帶來(lái)的請(qǐng)求碼,可根據(jù)code進(jìn)行不同的業(yè)務(wù)處理。
  • data:JS端請(qǐng)求時(shí)帶來(lái)的數(shù)據(jù),目前僅支持json格式。Java端通過(guò)data.readString()獲取請(qǐng)求json字符串。
  • reply:Java端返回給JS端的數(shù)據(jù),目前僅支持String格式,通過(guò)reply.writeString(str)寫(xiě)入返回?cái)?shù)據(jù)。
  • option:JS端指定同步或異步方式,Java端通過(guò)option.getFlag()獲取。

2、完善代碼邏輯

規(guī)定JS端每分頁(yè)加載一次評(píng)論數(shù)據(jù),就將目前頁(yè)面中的所有評(píng)論內(nèi)容發(fā)送給Java端進(jìn)行計(jì)算。流程和HTTP有一點(diǎn)類似,獲取數(shù)據(jù)、處理數(shù)據(jù)、返回?cái)?shù)據(jù)。鴻蒙提供了ZSONObject可供處理json,完整邏輯代碼如下:

 
 
 
 
  1. public class ServiceAbility extends Ability {
  2.     private MyRemote remote = new MyRemote();
  3.     @Override
  4.     public IRemoteObject onConnect(Intent intent) {
  5.         super.onConnect(intent);
  6.         return remote.asObject();
  7.     }
  8.     static class MyRemote extends RemoteObject implements IRemoteBroker {
  9.         private static final int LIST_COMMENTS = 200;
  10.         private static final int SUCCESS = 0;
  11.         private static final int ERROR = 500;
  12.         MyRemote() {
  13.             super("MyService_MyRemote");
  14.         }
  15.         MyRemote(String descriptor) {
  16.             super(descriptor);
  17.         }
  18.         @Override
  19.         public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) {
  20.             Map result = new HashMap<>(5);
  21.             if (code == LIST_COMMENTS) {
  22.                 // 獲取并轉(zhuǎn)化請(qǐng)求數(shù)據(jù)
  23.                 String req = data.readString();
  24.                 WordReq param = ZSONObject.stringToClass(req, WordReq.class);
  25.                 List comments = param.getList().stream().filter(e -> !"用戶未填寫(xiě)評(píng)價(jià)內(nèi)容".equals(e)).collect(Collectors.toList());
  26.                 // 統(tǒng)計(jì)評(píng)論字?jǐn)?shù)
  27.                 int longComments = (int) comments.stream().mapToInt(String::length).filter(len -> len >= 200).count();
  28.                 int mediumComments = (int) comments.stream().mapToInt(String::length).filter(len -> len >= 30 && len < 200).count();
  29.                 int shortComments = (int) comments.stream().mapToInt(String::length).filter(len -> len < 30).count();
  30.                 // 計(jì)算占比
  31.                 DecimalFormat df = new DecimalFormat("#.00");
  32.                 double longPer = 1.0 * longComments / comments.size() * 100;
  33.                 double mediumPer = 1.0 * mediumComments / comments.size() * 100;
  34.                 double shortPer = 1.0 * shortComments / comments.size() * 100;
  35.                 // 返回結(jié)果
  36.                 result.put("long", df.format(longPer) + "%");
  37.                 result.put("medium", df.format(mediumPer) + "%");
  38.                 result.put("short", df.format(shortPer) + "%");
  39.                 result.put("code", SUCCESS);
  40.                 result.put("msg", "ok");
  41.                 reply.writeString(ZSONObject.toZSONString(result));
  42.                 return true;
  43.             } else {
  44.                 result.put("code", ERROR);
  45.                 result.put("msg", "invalid code");
  46.                 reply.writeString(ZSONObject.toZSONString(result));
  47.                 return false;
  48.             }
  49.         }
  50.         @Override
  51.         public IRemoteObject asObject() {
  52.             return this;
  53.         }
  54.     }
  55. }

3、JS端遠(yuǎn)程調(diào)用

Java服務(wù)部分寫(xiě)好了,在JS中,鴻蒙提供了FeatureAbility.callAbility()方法用于單次請(qǐng)求Java服務(wù)。其參數(shù)如下:

  • bundleName:Ability包名,在config.json中,為app.bundleName。
  • abilityName:調(diào)用服務(wù)端Ability類名,可省略包名,直接寫(xiě)".XxxAbility"。
  • messageCode:操作碼,和Java端的"code"參數(shù)相匹配。
  • abilityType:Ability類型,0為Ability,1為Internal Ability。
  • data:請(qǐng)求數(shù)據(jù),json類型。
  • syncOption:與Java端"option"相匹配,0為同步方式,1為異步方式。默認(rèn)同步方式。

方法返回一個(gè)Promise對(duì)象,可通過(guò).then()和.catch()處理調(diào)用成功和異常。

本例中的方法如下:

 
 
 
 
  1. // 調(diào)用Java統(tǒng)計(jì)評(píng)論長(zhǎng)度
  2.     countWords() {
  3.         let list = [];
  4.         this.comments.forEach(e => {
  5.             list.push(e.content);
  6.         })
  7.         FeatureAbility.callAbility({
  8.             bundleName: "com.example.litemall",
  9.             abilityName: ".ServiceAbility",
  10.             messageCode: 200,
  11.             abilityType: 0,
  12.             data: {
  13.                 list
  14.             }
  15.         }).then(res => {
  16.             console.info(res);
  17.             let data = JSON.parse(res);
  18.             if (data.code == 0) {
  19.                 this.lengths[0].value = data.long;
  20.                 this.lengths[1].value = data.medium;
  21.                 this.lengths[2].value = data.short;
  22.             }
  23.         }).catch(res => {
  24.             console.error(res);
  25.         })
  26.     }

Java端和JS端的代碼編譯完成并運(yùn)行,可以看到日志中的返回?cái)?shù)據(jù)和我們?cè)贘ava中定義的一致。

運(yùn)行效果:

但加上Java的部分后,項(xiàng)目編譯的速度明顯變慢了,如下兩步花了很長(zhǎng)時(shí)間,有沒(méi)有大神知道有沒(méi)有什么加速的方法?

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.


網(wǎng)站題目:從微信小程序到鴻蒙JS開(kāi)發(fā)-JS調(diào)用Java
網(wǎng)頁(yè)網(wǎng)址:http://www.5511xx.com/article/dpdsdjj.html