更多内容请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com除了轻量化的智能穿戴设备,手机、鸿蒙目前支持的汽车、电视、手表、平板等都属于付鸿蒙。JS语言项目中也有Java模块,提供了JS跨语言调用Java方法的技术。现在需要实现查看商品评论时,长评、中评、短评占比的统计。这里请求review数据,调用Java计算。JS调用Java有两种方式:能力和内部能力。前者可以被不同的JS方法调用,后者适用于与JS业务逻辑强相关,对响应延迟要求高的服务。这里使用了Ability方法。1、在项目工程目录下的Java模块中新建一个ServiceAbility,右击项目的包,New->Ability->EmptyServiceAbility。在众多自动生成的重载方法中,我们需要用到的就是onConnect()。该方法在第一次连接时被回调,返回一个IRemoteObject对象用于后续的业务通信。所以创建一个继承RemoteObject类并实现IRemoteBroker接口的内部类。代码框架如下:(}Remote)Remote{super(descriptor);}@OverridepublicbooleanonRemoteRequest(intcode,MessageParceldata,MessageParcelreply,MessageOptionoption){...}@OverridepublicIRemoteObjectasObject(){returnthis;}}}主要实现的两个方法是onRemoteRequest()和asObject(),在onConnect()方法中返回内部类的例子中,asObject()直接返回this。onRemoteRequest()是需要实现的主要业务方法,它有四个参数:code:请求码JS端请求带来的,可以根据代码进行不同的业务处理data:JS端请求带来的数据,目前只支持jsonf格式。Java端通过data.readString()获取请求json字符串。reply:从Java端返回给JS端的数据,目前只支持String格式,通过reply.writeString(str)写入返回数据。option:在JS端指定同步或异步方式,在Java端通过option.getFlag()获取。2.改进代码逻辑。规定JS端每次分页加载评论数据,然后将当前页面的评论内容全部发送给Java端进行计算。过程有点类似于HTTP,获取数据,处理数据,返回数据。鸿蒙提供了ZSONObject可供处理json,完整逻辑代码如下:publicclassServiceAbilityextendsAbility{privateMyRemoteremote=newMyRemote();@OverridepublicIRemoteObjectonConnect(Intentintent){super.onConnect(intent);returnremote.asObject();}staticclassMyRemoteextendsRemoteObjectimplementsIRemoteBroker{privatestaticfinalintLIST_COMMENTS=200;privatestaticfinalintSUCCESS=0;privatestaticfinalintERROR=500;MyRemote(){super("MyService_MyRemote");}MyRemote(Stringdescriptor){super(descriptor);}@OverridepublicbooleanonRemoteRequest(intcode,MessageParceldata,MessageParcelreply,MessageOptionoption){Mapresult=newHashMap<>(5);if(code==LIST_COMMENTS){//获取并转换请求数据Stringreq=data.readString();WordReqparam=ZSONObject.stringToClass(req,WordReq.??class);Listcomments=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<200).count();intshortComments=(int)comments.stream().mapToInt(String::length).filter(len->len<30).count();//计算占比DecimalFormatdf=newDecimalFormat("#.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","invalidcode");reply.writeString(ZSONObject.toZSONString(result));returnfalse;}}@OverridepublicIRemoteObjectasObject(){returnthis;}}}3、JS端远程调用Java服务部分已经写好了。在JS中,鸿蒙提供了FeatureAbility.callAbility()方法,用于对Java服务的单次请求。参数如下:bundleName:能力包名称,在config.json中为app.bundleName。abilityName:调用服务端Ability类名,可以省略包名直接写“.XxxAbility”。messageCode:操作码,与Java端的“code”参数匹配。abilityType:能力类型,0为能力,1为内在能力。data:请求数据,json类型。syncOption:匹配Java端的“option”,0表示同步模式,1表示异步模式。默认同步方法。该方法返回一个Promise对象,它可以通过.then()和.catch()处理调用成功和异常。本例方法如下://调用Java统计评论长度countWords(){letlist=[];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);letdata=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部分后,项目编译速度明显变慢。下面两步就花了很长时间。有谁知道有什么办法可以加快速度吗?更多信息请访问:Harmonyos.51cto.com,与华为官方合作打造的鸿蒙技术社区