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

news2024/9/24 9:25:55

概述

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

样例展示

基础信息

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

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

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

相关文章

LeetCode 每日一题 Day 88 - 94

2673. 使二叉树所有路径值相等的最小代价 给你一个整数 n 表示一棵 满二叉树 里面节点的数目&#xff0c;节点编号从 1 到 n 。根节点编号为 1 &#xff0c;树中每个非叶子节点 i 都有两个孩子&#xff0c;分别是左孩子 2 * i 和右孩子 2 * i 1 。 树中每个节点都有一个值&a…

DevOps中集成自动化测试的具体案例

在DevOps中集成自动化测试的具体案例可以从多个角度进行分析,包括金融行业、分布式系统、大型企业等不同领域的实践。以下是几个具体的案例: 金融行业的DevOps实践:在金融行业中,DevOps被广泛应用于提升软件开发和运营的效率。例如,通过解析后台接口代码日志格式,自动化生…

剑指offer--c++--n个骰子的点数

目录 题目&#xff1a; 题目分析&#xff1a; 最后编写代码&#xff1a; 输出结果 题目&#xff1a; 把n个骰子扔在地上&#xff0c;所有骰子朝上一面的点数之和为s。输入n&#xff0c;打印出s的所有可能的值出现的概率。 感谢大佬的帮助&#xff1a;https://www.cnblogs.c…

java面试(消息队列MQ)

MQ有什么用&#xff1f;有哪些场景&#xff1f; MQ&#xff08;MessageQueue&#xff09;消息队列。队列&#xff08;FIFO&#xff09;先进先出的数据结构&#xff0c;消息由生产者发送到MQ&#xff0c;后由消费者对消息进行处理。QQ&#xff0c;微信就是MQ场景。 MQ作用&…

第七个程序:两个字符串连接后计算长度

实验步骤; 第一步&#xff1a;新建项目 第二步&#xff1a;程序编写 第三步&#xff1a;运行结果 Labview一共7个字节&#xff0c;长度为7&#xff0c;一个字母一个字节 汉字为2个字节&#xff0c;图一为4&#xff0c;图二为8 所以结果分别为11和15 视频教学&#xff1a; 字…

Android开发技术总结,附项目源码

今天本文主要讲解&#xff1a; APK文件反编译 什么是反编译如何防止反编译APK文件的基本构造 APK加固的方案原理 APK加固总体架构APK打包基本流程Dex文件的意义 AES加密项目实战 APK加固项目实战APK脱壳技术实战 一.APK文件反编译 1.什么是反编译 定义&#xff1a; 利用…

一次电脑感染Synaptics Pointing Device Driver病毒的经历,分享下经验

没想到作为使用电脑多年的老司机也会电脑中病毒&#xff0c;周末玩电脑的时候突然电脑很卡&#xff0c;然后自动重启&#xff0c;奇怪&#xff0c;之前没出现这个情况。 重启后电脑开机等了几十秒&#xff0c;打开任务管理器查看开机进程&#xff0c;果然发现有个Synaptics Po…

【ICM】好奇心机制

文章目录 样本经验处理降低图片像素和通道构建连续状态捕捉动作经验回放类 各部分的模型编码器模型反向模型正向模型DQN模型ICM 的 反向传播 概念补充强化学习组成元素按照学习目标来分按照策略更新方式区分强化学习on-line 与 off-line经验回放 全部代码 样本经验处理 降低图…

代码随想录 二叉树第五周

目录 235.二叉搜索树的最近公共祖先 701.二叉搜索树的插入操作 450.删除二叉搜索树中的节点 669.修建二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 235.二叉搜索树的最近公共祖先 235. 二叉搜索树的最近公共祖先 中等 给定一个二叉搜索树,…

“声震四方,贼人退散;平安守护,行者无忧。”#STM32项目一 《电动车报警器》

“声震四方&#xff0c;贼人退散&#xff1b;平安守护&#xff0c;行者无忧。”#STM32项目一 电动车报警器 前言预备知识1.电动车报警器项目概述1.1项目需求1.2项目框图1.3.硬件清单 2.振动传感器介绍及实战2.1振动传感器介绍2.2振动传感器接线2.3使用STM32CubeMX建立工程2.4程…

Spring 类型转换、数值绑定与验证(三)— Formatting 与 Validation

1 Formatting 在Spring中用于格式化数据及根据地域展示不同格式的数据。 图 Formatting接口 UML 1.1 注解驱动Formatting 自定义像“DateTimeFormat”注解来对相关字段格式化的步骤为&#xff1a; 自定义注解。定义一个实现AnnotationFormatterFactory接口的工厂类。往容器…

亚马逊卖家做市场分析业务可以用静态IP代理完成吗?

亚马逊作为全球最大的电商平台之一&#xff0c;其庞大的销售数据和用户行为数据成为了许多商家和市场研究人员进行市场分析和竞争研究的重要来源。而使用IP代理则能够为亚马逊市场分析带来许多帮助&#xff0c;下面就来一一介绍。静态IP代理可以为市场分析带来哪些帮助&#xf…

DatasetsDataLoader

PyTorch 提供了两个数据基类&#xff1a; torch.utils.data.DataLoader 和 torch.utils.data.Dataset。允许你使用预加载的数据集以及你自己的数据集。 Dataset 存储样本和它们相应的标签&#xff0c;DataLoader 在 Dataset 基础上添加了一个迭代器&#xff0c;迭代器可以迭代数…

【Java JVM】对象回收判断

Java 对象回收判断是程序设计中至关重要的一环。在面向对象的编程中, 合理的对象回收策略直接影响着程序的性能和内存利用效率。 因此, 深入了解和准确判断 Java 对象的回收时机, 不仅可以优化程序的运行性能, 还能有效避免内存泄漏和资源浪费。 本文将简单的分析一下 JVM 中对…

Java递归生成本地文件目录树形结构

Java递归生成本地文件目录(树行结构) 1.读取txt文件保存的文件目录结构 2.递归生成本地文件目录树形结构&#xff0c;并修改目录文件前缀进行递增 3.结果截图 4.代码 package com.zfi.server.device;import io.swagger.annotations.Api; import org.springframework.web.bind…

springcloud:3.2测试超时机制

服务提供者 Openfeign远程调用服务提供者搭建 文章地址http://t.csdnimg.cn/06iz8 PaymentController【控制层】 /*** 测试超时机制** return*/GetMapping("/timeout")public String TimeOut() {try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {…

win11下安装mysql

一、下载MySQL 官方下载传送门 我安装的版本是5.7.83 二、安装MySQL 1.双击安装包 2.选择Custom(自定义安装)&#xff0c;然后Next> 3.根据你的系统做选择&#xff0c;我的是64位&#xff0c;所选MySQL Servers 5.7.38 -x64&#xff0c;然后按箭头将选中的版本移到右边…

android开发工具,美团安卓面试

1、java中和equals和hashCode的区别 基本数据类型的比较的值相等. 类的比较的内存的地址&#xff0c;即是否是同一个对象&#xff0c;在不覆盖equals的情况下&#xff0c;同比较内存地址&#xff0c;原实现也为 &#xff0c;如String等重写了equals方法. hashCode也是Object类…

电子设备内幕:RAM和ROM小百科

大家好&#xff0c;我是知微。 在智能手机出现之前&#xff0c;大家对RAM和ROM这两个词都没什么概念。如今很多手机在宣传的时候&#xff0c;都会标明有多大的RAM(运行内存)和ROM(存储空间)&#xff0c;因为这在很大程度上影响手机的使用流畅度和使用寿命。 其实&#xff0c;…

【ONE·基础算法 || 双指针】

总言 主要内容&#xff1a;编程题举例&#xff0c;理解双指针思想。       文章目录 总言1、双指针2、零移动&#xff08;easy&#xff09;2.1、思路分析2.2、题解 3、复写零&#xff08;easy&#xff09;3.1、题解 4、快乐数&#xff08;medium&#xff09;4.1、思路分析4…