ajax调用java程序,从微信小程序到鸿蒙JS开发-JS调用Java

1a7db37525f12a48238d7c58f66554f0.png

除轻量级智能穿戴设备,现鸿蒙支持的手机、汽车、TV、手表、平板等属于富鸿蒙,在JS语言的项目中也有Java模块,并提供了JS跨语言调用Java方法的技术。现需要实现查看商品评论时,统计出长评、中评和短评的比例,这里将评论数据请求来后调用Java进行计算。

JS调用Java有Ability方式和Internal Ability方式两种,前者可以被不同的JS方法调用,后者适用于与JS业务逻辑关联性强,响应时延要求高的服务。这里采用Ability的方式。

1、新建一个Service Ability

在项目工程目录Java模块中,右键项目的包,New->Ability->Empty Service Ability。

8b3cf0e42d80d28ff133500c06b90845.png

在自动生成的众多重载方法中,我们需要用到的是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中定义的一致。

52d39868f48d2ce557696139c4eaf57c.png

运行效果:

218ee3eea703595d55ca2e6f7aa51984.png

84c326367220c1b8a4f619c6e2015449.png

但加上Java的部分后,项目编译的速度明显变慢了,如下两步花了很长时间,有没有大神知道有没有什么加速的方法?

c46cd9aea9c7dc83ce85d8d73988b75d.png

1805adf15f908701cd21ef3f21c8a875.png

67eeee49b4f6094f6912c511f097e042.png

【编辑推荐】

【责任编辑:jianghua TEL:(010)68476606】

点赞 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文本删除空行_010 Editor for mac(文本和十六进制编辑器)

为大家带来最新版本的010 Editor for mac&#xff0c;这是一款专业的文本和十六进制编辑器&#xff0c;新版本的010 editor mac版包含了语法突出显示、更多字符集支持、添加了删除行和删除空行命令等新功能&#xff0c;另外修复了各种错误&#xff0c;功能更加全面。010editor …

Mybatis-Plus之四种lambda方式LambdaQueryWrapper,QueryWrapper<实体>().lambda(),LambdaQueryChainWrapper<实体>

Mybatis-Plus之四种lambda方式 lambda四种表达形式 前言 使用了lambda表达式 可以通过方法引用的方式来使用实体字段名的操作&#xff0c;避免直接写数据库表字段名时的错写名字&#xff1b; 一、LambdaQueryWrapper<> /*** lambda 条件构造器* 生成的sql语句 SELECT…

sql怎么修改服务器角色,sql角色服务器的设置

sql角色服务器的设置 内容精选换一换如果您需要对华为云上购买的DDM资源&#xff0c;为企业中的员工设置不同的访问权限&#xff0c;为达到不同员工之间的权限隔离&#xff0c;您可以使用统一身份认证服务(Identity and Access Management&#xff0c;简称IAM)进行精细的权限管…

ecshop根目录调用_ECSHOP各文件夹功能说明

ECSHOP各文件夹功能说明1、根目录&#xff1a;前台程序文件2、admin&#xff1a;后台程序文件夹--根目录&#xff1a;后台程序文件*.php文件--help\zh_cn&#xff1a;各功能的帮助文件*.xml文件--images&#xff1a;后台页面用图片--includes&#xff1a;后台公用文件和函数--j…

MybatisPlus——selectPage

没mybatisPlus坐标的可以导一下 <!--mybatis-plus的springboot支持--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.2.0</version></dependency>select…

MyBatis-Plus——字段类型处理器TypeHandler

字段类型处理器&#xff08;TypeHandler&#xff09; 1&#xff0c;准备工作 &#xff08;1&#xff09;MyBatis 中的 TypeHandler 类型处理器用于 JavaType 与 JdbcType 之间的转换&#xff0c;假设我们用户表中有一个联系方式字段&#xff0c;类型为字符串&#xff1a; &am…

额外参数_Pytorch获取模型参数情况的方法

分享人工智能技术干货&#xff0c;专注深度学习与计算机视觉领域&#xff01;相较于Tensorflow&#xff0c;Pytorch一开始就是以动态图构建神经网络图的&#xff0c;其获取模型参数的方法也比较容易&#xff0c;既可以根据其内建接口自己写代码获取模型参数情况&#xff0c;也可…

Mybatis-Plus之逻辑删除

概念 什么是逻辑删除 逻辑删除:假删除。将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录。 数据库实现思路:插入数据时,标记为未删除状态;查询、修改时,只获取未删除状态的数据进行操作;删除时则更新删除状态为已删除…

查看分支编码_MySQL分支数据库MariaDB之CentOS安装教程

MariaDB数据库管理系统是MySQL的一个分支&#xff0c;由MySQL的创始人Michael Widenius主持开发。采用GPL授权许可 MariaDB的目的是完全兼容MySQL&#xff0c;包括API和命令行&#xff0c;在存储引擎方面&#xff0c;使用XtraDB(英语&#xff1a;XtraDB)来代替MySQL的InnoDB。1…

关联规则算法c语言样例及分析_推荐系统总结系列-关联规则算法(四)

基于关联规则的推荐有三种方法&#xff1a;Apriori关联规则算法FP Tree关联规则算法&#xff1b;PrefixSpan关联规则算法&#xff1b;关联规则挖掘推荐算法&#xff1a;关联规则挖掘是一种在大规模交易中识别类似规则关系模式的通用技术&#xff0c;可以应用到推荐系统中。交易…

perclos嘴巴_一种基于视频分析的疲劳状态检测方法及装置与流程

本发明涉及疲劳检测领域&#xff0c;特别是涉及一种基于视频分析的疲劳状态综合检测方法及装置。背景技术&#xff1a;疲劳状态检测技术在交通运输、生产安全、教育培训等许多领域应用广泛。目前&#xff0c;疲劳状态检测的方法一般可分为接触式和非接触式两大类。其中&#xf…

Mybatis-Plus条件

Mybatis-Plus条件 条件构造器 说明: 以下出现的第一个入参boolean condition表示该条件是否加入最后生成的sql中没有标明condition的方法,默认为true以下出现的泛型Param均为Wrapper的子类实例(均具有AbstractWrapper的所有方法)以下方法在入参中出现的R为泛型,在普通wrapper中…

Mysql - Innodb锁、事务与隔离级别

我们的数据库一般都会并发执行多个事务&#xff0c;多个事务可能会并发的对相同的一批数据进行增删改查操作&#xff0c;可能就会导致脏写、脏读、不可重复读、幻读这些问题。 这些问题的本质都是数据库的多事务并发问题&#xff0c;为了解决多事务并发问题&#xff0c;数据库…

东南西北十字图_word画东南西北方向图标 怎么在Word里绘制方向十字图标

如果你使用的是2007版的话&#xff0c;可以在插入选项中找到插入图形选项&#xff0c;里面有一个箭头总汇&#xff0c;选择你所需要的就行了&#xff01;如果是2003版的话&#xff0c;也可以在插入选项中找到图形&#xff0c;里面也有这一项&#xff01;怎么样在word07文档里键…

语言非递归求解树的高度_算法素颜(11):无死角“盘”它!二分查找树

引言《菜鸟也能“种”好二叉树&#xff01;》一文中提到了&#xff1a;为了方便查找&#xff0c;需要进行分层分类整理。而满足这种目标的数据结构之一就是树。树的叶子节点可以看作是最终要搜寻的目标物&#xff1b;叶子节点以上的每一层&#xff0c;都可以看作是一个大类别、…

Mysql InnoDB存储引擎的锁相关

Mysql InnoDB存储引擎的锁相关 InnoDB下&#xff0c;mysql四个级别隔离下加锁操作 四个级别隔离的写操作都加X锁串行化下读加S锁select … for update, select … lock in share mode 分别加x锁&#xff0c;s锁在需要加锁的场景下&#xff0c;会根据情况使用三种加锁策略&…

安装python37路径报错_Robot framework安装python3.7导入HttpLibrary.HTTP报错

报错信息&#xff1a;20200106 18:23:28.178 [WARN]: Importing test library "HttpLibrary.HTTP" failedTraceback (most recent call last):Importing test library HttpLibrary.HTTP failed: SyntaxError: invalid syntax (__init__.py, line 16)Traceback (most …

MySQLl的可串行化_mysql事务串行化的锁机制是怎样的?

1、mysql的可串行化 首先&#xff1a;可串行化serializable 这是事务的最高级别&#xff0c;在每条读的数据上&#xff0c;加上锁&#xff0c;使之不可能相互冲突&#xff0c;因此&#xff0c;会导致大量的超时现象。 解释如下&#xff1a; 以A&#xff0c;B用户为例&#…

显示器尺寸对照表_电脑显示器尺寸对照表一览,教你怎么选择最适合自己的显示器尺寸...

显示小课堂&#xff1a;显示器买大买小谁说了算&#xff1f; [本文来自&#xff1a;www.ii77.com]今天&#xff0c;笔者想和大家讨论一下关于显示器尺寸选择方面的问题。通过这两年显示器行业的发展我们不难看出&#xff0c;现在显示器的尺寸越来越大&#xff0c;三十几吋、四十…

MySQL事务隔离级别理解_解读MYSQL的可重复读、幻读及实现原理

前言 提到事务&#xff0c;你肯定不会陌生&#xff0c;最经典的例子就是转账&#xff0c;甲转账给乙100块&#xff0c;当乙的账户中到账100块的时候&#xff0c;甲的账户就应该减去100块&#xff0c;事务可以有效的做到这一点。 在MySQL中&#xff0c;事务支持实在引擎层实现的…