鸿蒙实战开发:数据交互【RPC连接】

概述

本示例展示了同一设备中前后台的数据交互,用户前台选择相应的商品与数目,后台计算出结果,回传给前台展示。

样例展示

基础信息

image.png

RPC连接

介绍

本示例使用[@ohos.rpc]相关接口,实现了一个前台选择商品和数目,后台计算总价的功能,使用rpc进行前台和后台的通信。

效果预览

主页选择列表

使用说明:

  1. 点击商品种类的空白方框,弹出商品选择列表,选择点击对应的商品,空白方框显示相应内容。
  2. 点击商品选择框后的 +- 按钮,选择商品所对应的数量。
  3. 点击 Confirm an order 按钮,根据相应的菜品数量与单价,计算出总价并显示。

具体实现

  • 发送数据:在首页的sortString()中通过rpc.MessageSequence.create()创建MessageSequence对象,然后通过MessageSequence.writeStringArray()将 我们的处理过的购物数据写入MessageSequence对象中,通过rpc.RemoteObject.sendMessageRequest()将我们得出总价所需要的参数发送到进程中, 源码参考:[Index.ets]
/*

 * Copyright (c) 2021-2023 Huawei Device Co., Ltd.

 * Licensed under the Apache License, Version 2.0 (the "License");

 * you may not use this file except in compliance with the License.

 * You may obtain a copy of the License at

 *

 *     http://www.apache.org/licenses/LICENSE-2.0

 *

 * Unless required by applicable law or agreed to in writing, software

 * distributed under the License is distributed on an "AS IS" BASIS,

 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

 * See the License for the specific language governing permissions and

 * limitations under the License.

 */



import rpc from '@ohos.rpc'

import ReceivedData from '../model/ReceivedData'

import { ProcessData } from '../model/ProcessData'

import { Logger } from '../common/Logger'

import { MyDataSource } from '../model/OptionsData'

import { OPTIONS } from '../muck/MyData'

import { TitleBar } from '../common/TitleBar'

import { FlexList } from '../common/FlexList'



const REQUEST_CODE: number = 1

type SelectType = {

  subcategory: string,

  count: number

}



@Entry

@Component

struct Index {

  @State send: string = ''

  @State result: number = 0

  private Process: ProcessData = new ProcessData()

  private selectStuffs: Array<SelectType> = new Array(4).fill({ subcategory: '', count: 0 })



  selectStuff(index: number, good: string, count: number) {

    Logger.info(`index=  ${index}, count= ${count}, good= ${good}`)

    this.selectStuffs[index] = { subcategory: good, count: count }

  }



  async sortString(sendData: Array<string>) {

    Logger.info(`sortString is ${sendData}`)

    Logger.info(`sendData typeof ${typeof (sendData)}`)

    let option: rpc.MessageOption = new rpc.MessageOption()

    let data: rpc.MessageSequence = rpc.MessageSequence.create()

    let reply: rpc.MessageSequence = rpc.MessageSequence.create()

    Logger.info(`getCallingUid: ${ReceivedData.getCallingUid()}  getCallingPid: ${ReceivedData.getCallingPid()}`)

    data.writeStringArray(sendData)

    try {

      await ReceivedData.sendMessageRequest(REQUEST_CODE, data, reply, option)

    } catch (err) {

      Logger.error(`sortString failed, ${JSON.stringify(err)}`)

    }

    this.result = reply.readInt()

    reply.reclaim()

  }



  build() {

    Scroll() {

      Column() {

        TitleBar()

        LazyForEach(new MyDataSource(OPTIONS), (item, index) => {

          Row() {

            FlexList({

              category: item.category,

              menu: item.subcategory,

              index: index,

              selectStuff: this.selectStuff.bind(this)

            })

          }

        }, item => JSON.stringify(item))



        Column() {

          Row() {

            Text($r('app.string.final_price'))

              .width('65%')

              .height(25)

              .fontSize(18)

              .textAlign(TextAlign.Center)



            Text(this.result.toString())

              .id('totalPrice')

              .height(25)

              .fontSize(20)

              .margin({ left: '5%' })

              .textAlign(TextAlign.Center)

          }

          .justifyContent(FlexAlign.Center)

          .width('80%')



          Button($r('app.string.confirm'))

            .id('confirmOrderBtn')

            .width('80%')

            .height(40)

            .margin({ top: 30 })

            .onClick(() => {

              let priceArray = this.Process.getPrice(this.selectStuffs)

              Logger.info(`priceArray= ${priceArray}`)

              this.sortString(priceArray)

            })

        }

        .width('100%')

        .justifyContent(FlexAlign.Center)

        .margin({ top: 20 })

        .height('30%')

      }

      .width('100%')

    }

  }

}
  • 读取数据:处理MessageRequest请求的接口封装在ReceivedData里面,在这里接收传递来的数据,然后经过处理得出总价, 并通过rpc.MessageParcel.writeInt()写入MessageParcel对象,源码参考:[ReceivedData.ets]
/*

 * Copyright (c) 2021-2023 Huawei Device Co., Ltd.

 * Licensed under the Apache License, Version 2.0 (the "License");

 * you may not use this file except in compliance with the License.

 * You may obtain a copy of the License at

 *

 *     http://www.apache.org/licenses/LICENSE-2.0

 *

 * Unless required by applicable law or agreed to in writing, software

 * distributed under the License is distributed on an "AS IS" BASIS,

 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

 * See the License for the specific language governing permissions and

 * limitations under the License.

 */



import rpc from '@ohos.rpc'

import { Logger } from '../common/Logger'

import { PRICE_LIST } from '../muck/MyData'



const TAG = '[eTSRPC.ReceivedData]'

let resultList: Array<number> = Array.from({ length: 4 }, () => 0)



class ReceivedData extends rpc.RemoteObject {

  onRemoteRequest(code: number, data: rpc.MessageParcel, reply: rpc.MessageParcel, option: rpc.MessageOption): boolean {

    Logger.info(TAG, `called`)

    if (code === 1) {

      let result = 0

      let readIntArr

      try {

        readIntArr = data.readStringArray()

      } catch (err) {

        Logger.error(`readStringArray failed, code is ${err.code}, message is ${err.message}`)

      }

      Logger.info(TAG, `readIntArr= ${readIntArr}`)

      for (let i = 0; i < 4; i++) {

        if (readIntArr[i] === '0') {

          resultList[i] = 0

        } else {

          resultList[i] = PRICE_LIST.get(readIntArr[i]) * Number(readIntArr[i+4])

        }

        Logger.info(TAG, `this.resultList= ${resultList}`)

        result += resultList[i]

      }

      try {

        reply.writeInt(result)

      } catch (err) {

        Logger.error(TAG, `writeInt failed, code is ${err.code}, message is ${err.message}`)

      }

      Logger.info(TAG, `result= ${result}`)

    } else {

      Logger.info(TAG, `unknown request code`)

    }

    return true

  }

}



export default new ReceivedData('send')

鸿蒙OpenHarmony知识待更新

c4239e28a4e48de5e1bbf2ecb8e239cd.jpeg

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

推荐一本书籍,澳福读后发现投资真谛

在现在的经济环境下&#xff0c;澳福外汇推荐各位投资读一本书籍就会发现投资者的真谛&#xff0c;那就是经济危机爆发前一年&#xff0c;黎巴嫩裔美国商人纳西姆尼古拉斯塔勒布出版的《黑天鹅:极不可能事件的影响》&#xff0c;在书中一书作者用“黑天鹅事件”这个词来指代影响…

一、项目中Camunda的使用

基本依赖请看另一篇文章 camunda学习使用 介绍 开始事件 结束事件 网关 顺序流 任务 用户任务 活动 上面是项目中使用到的一些图形&#xff0c;简单介绍一下 项目集成 依赖 <spring-boot.version>2.5.6</spring-boot.version> <spring-cloud.version>20…

智能门锁:越便宜,越难卖?

【潮汐商业评论/ 原创】 独居的Gail最近在网上种草了一款带电子猫眼的智能门锁&#xff0c;用她的话来说&#xff1a;“这小东西不仅是个电子锁&#xff0c;还是个智能监控&#xff0c;太适合独居的我了&#xff0c;天知道之前给快递员、外卖员开门都要纠结半天啊。” 但烦恼…

运维知识点-hibernate引擎-HQL

HQL有两个主要含义&#xff0c;分别是&#xff1a; HQL&#xff08;Hibernate Query Language&#xff09;是Hibernate查询语言的缩写&#xff0c;它是一种面向对象的查询语言&#xff0c;类似于SQL&#xff0c;但不是去对表和列进行操作&#xff0c;而是面向对象和它们的属性…

一台云服务器在手,天下我有!2024年3月上云采购季不可错过!

有一台云服务器可以做什么&#xff1f; 搭建微信提醒小助手、搭建个人博客、运行一个365天不休息的程序、存文件、定时发送邮件、数据爬取、加速网络请求、学习使用Linux命令&#xff08;部署&#xff09;、部署自己的小程序的服务端、青龙面包薅羊毛 这些都是常规用法&#xf…

openGauss环境搭建 | 新手指南

一、搭建准备 openGauss开发需要使用linux环境&#xff0c;先下载远程连接工具Xshell/MobaXterm 。 1. 使用工具连接远程linux服务器&#xff0c;使用root账号远程登录&#xff0c;创建个人账号。 useradd -d /home/xxx -m xxx 2. 设置密码。 passwd xxx 3. 切换到个人账…

【归并排序】AcWing. 505 / NOIP2013提高组《火柴排队》(c++)

【题目描述】 涵涵有两盒火柴&#xff0c;每盒装有 n 根火柴&#xff0c;每根火柴都有一个高度。 现在将每盒中的火柴各自排成一列&#xff0c;同一列火柴的高度互不相同&#xff0c;两列火柴之间的距离定义为&#xff1a; 其中 ai 表示第一列火柴中第 i 个火柴的高度&a…

gitlab的安装

1、下载rpm 安装包 (1)直接命令下载 wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-11.6.10-ce.0.el7.x86_64.rpm&#xff08;2&#xff09;直接去服务器上下载包 Index of /gitlab-ce/yum/el7/ | 清华大学开源软件镜像站 | Tsinghua Open Source…

基于springboot+vue的政府管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Maya笔记 软选择

文章目录 1什么是软选择2注意3如何打开软选择3.1方法一3.2方法二 4调整软选择的范围5衰减模式5.1体积模式5.2表面模式 6衰减曲线 1什么是软选择 也就是渐变选择&#xff0c;从中心点向外影响力度越来越小 软选择针对的是点线面这些模型元素 下图中展示了对被软选择的区域移动…

禅道软件介绍:开源版(免费)和付费版的区别

禅道免费版是有两个版本其中一个是开源的&#xff0c;另一个是云禅道的5人以下免费版。禅道免费版和付费版的区别在于&#xff1a;禅道免费版虽然提供基础项目管理功能&#xff0c;但也只适合有技术能力自行维护和定制的团队。付费版&#xff08;如企业版、旗舰版&#xff09;则…

在nginx 服务器部署vue项目

以人人快速开发的开源项目&#xff1a;renren-fast-vue 为例 注&#xff1a;这里开始认为各位都会使用nginx 打包vue项目 npm run build 测试打包的项目是否可以运行 serve dist 可以正常运行 编译报错请移步到&#xff1a;renren-fast-vue1.2.2 项目编译报错: build g…

微信公众号公司主体变更怎么办?

公众号迁移的好处有哪些&#xff1f;迁移后原公众号还能用吗&#xff1f;1&#xff09;获得更多权限功能如果公众号是个人主体&#xff0c;想进行认证&#xff0c;拥有更多权限功能。例如菜单栏跳转外部链接&#xff0c;相拥有留言功能&#xff0c;服务号认证获得开发权限等。就…

字节后端实习 一面凉经

心脏和字节永远都在跳动 深圳还有没有大厂招后端日常实习生啊&#xff0c;求捞&#xff5e;&#xff08;boss小公司也不理我&#xff09; 很纠结要不要干脆直接面暑期实习&#xff0c;又怕因为没有后端实习经历&#xff0c;面不到大厂实习。死锁了

java算法第十五天 | ● 层序遍历 ● 226.翻转二叉树 ● 101.对称二叉树

层序遍历 思路&#xff1a; 需要借用一个辅助数据结构即队列来实现&#xff0c;队列先进先出&#xff0c;符合一层一层遍历的逻辑&#xff0c;而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。 而这种层序遍历方式就是图论中的广度优先遍历&#xff0c;只不过我们应用在…

智能AI数字人直播源码系统 帮你打造24不间断直播间 带完整的搭建教程

在数字化时代&#xff0c;直播已成为企业与个人展示自我、传递信息的重要渠道。然而&#xff0c;传统直播方式受限于时间、人力等因素&#xff0c;难以实现全天候的直播服务。下面&#xff0c;小编给大家介绍一款智能AI数字人直播源码系统&#xff0c;帮助用户轻松打造24小时不…

STM32的RCC原理(复位和时钟控制)

基本概念 STM32微控制器的RCC&#xff08;Reset and Clock Control&#xff09;模块是一个非常重要的部分&#xff0c;它负责管理微控制器的时钟系统和复位系统。以下是一些基本的原理和概念&#xff1a; 时钟源&#xff1a;STM32微控制器的时钟系统有多个时钟源&#xff0c;包…

【人工智能课程】计算机科学博士作业三

【人工智能课程】计算机科学博士作业三 来源&#xff1a;李宏毅2022课程第10课的作业 1 图片攻击概念 图片攻击是指故意对数字图像进行修改&#xff0c;以使机器学习模型产生错误的输出或者产生预期之外的结果。这种攻击是通过将微小的、通常对人类难以察觉的扰动应用于输入…

使用 Docker 部署 File Browser 文件管理系统

1&#xff09;File Browser 介绍 官网&#xff1a;https://filebrowser.org/ GitHub&#xff1a;https://github.com/filebrowser/filebrowser 今天为大家分享一款开源的私有云盘项目&#xff1a;File Browser&#xff0c;简单实用、轻量级、跨平台&#xff0c;安装部署简单快…

Day 6.有名信号量(信号灯)、网络的相关概念和发端

有名信号量 1.创建&#xff1a; semget int semget(key_t key, int nsems, int semflg); 功能&#xff1a;创建一组信号量 参数&#xff1a;key&#xff1a;IPC对像的名字 nsems&#xff1a;信号量的数量 semflg&#xff1a;IPC_CREAT 返回值&#xff1a;成功返回信号量ID…