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

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
從微信小程序到鴻蒙JS開發(fā)-JS調用Java

想了解更多內容,請訪問:

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

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

https://harmonyos.

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

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

1、新建一個Service Ability

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

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

因此創(chuàng)建一個內部類,繼承RemoteObject類并實現(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. }

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

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

2、完善代碼邏輯

規(guī)定JS端每分頁加載一次評論數(shù)據(jù),就將目前頁面中的所有評論內容發(fā)送給Java端進行計算。流程和HTTP有一點類似,獲取數(shù)據(jù)、處理數(shù)據(jù)、返回數(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.                 // 獲取并轉化請求數(shù)據(jù)
  23.                 String req = data.readString();
  24.                 WordReq param = ZSONObject.stringToClass(req, WordReq.class);
  25.                 List comments = param.getList().stream().filter(e -> !"用戶未填寫評價內容".equals(e)).collect(Collectors.toList());
  26.                 // 統(tǒng)計評論字數(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.                 // 計算占比
  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.                 // 返回結果
  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端遠程調用

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

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

方法返回一個Promise對象,可通過.then()和.catch()處理調用成功和異常。

本例中的方法如下:

 
 
 
 
  1. // 調用Java統(tǒ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端的代碼編譯完成并運行,可以看到日志中的返回數(shù)據(jù)和我們在Java中定義的一致。

運行效果:

但加上Java的部分后,項目編譯的速度明顯變慢了,如下兩步花了很長時間,有沒有大神知道有沒有什么加速的方法?

想了解更多內容,請訪問:

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

https://harmonyos.


當前題目:從微信小程序到鴻蒙JS開發(fā)-JS調用Java
本文路徑:http://m.5511xx.com/article/dpdsdjj.html