【Harmony OS】【JAVA UI】鸿蒙系统中怎么使用Parcel进行存储数据或数据传递
-
Parcel简介
在IPC过程中,发送方可以使用Parcel提供的写方法,将待发送的数据以特定格式写入Parcel对象。接收方可以使用Parcel提供的读取方法从Parcel对象中读取特定格式的数据。
Parcel实例的默认容量为200KB。如果您想要更多或更少,请使用setCapacity(int)更改它。
注意:只有以下数据类型的数据才能写入或从包裹中读取: byte, byteArray, short, shortArray, int, intArray, long, longArray, float, floatArray, double, doubleArray, boolean, booleanArray, char, charArray, String, StringArray、 PlainBooleanArray, Serializable, Sequenceable, 和 SequenceableArray。
-
方法介绍
2.1 addAppClassLoader(ClassLoader newClassLoader)public void addAppClassLoader(ClassLoader newClassLoader)添加第三方ClassLoader用于实例初始化。如果您需要封装或取消封装自定义序列化数据,请添加您自己的ClassLoader。
2.2 writeSequenceablepublic final void writeSequenceable(Sequenceable val)将可序列化对象写入Parcel实例。其余的方法参考文档Parcel资料
-
封装Sequenceable实体类我们参考Sequenceable资料
-
动手实践
今天将一个Sequenceable的集合存到Parcel然后读取出来
4.1 新建两个类 A类用户存放具体属性,B类用于存放A的实体类集合
A类代码如下public static class A implements Sequenceable { private int a; private int b; private int c; public A() { this(0, 0, 0); } public A(int a, int b, int c) { this.a = a; this.b = b; this.c = c; } @Override public boolean hasFileDescriptor() { return false; } @Override public boolean marshalling(Parcel out) { out.writeInt(a); out.writeInt(b); out.writeInt(c); return true; } @Override public boolean unmarshalling(Parcel in) { a = in.readInt(); b = in.readInt(); c = in.readInt(); return true; } public static final Sequenceable.Producer<A> PRODUCER = new Sequenceable.Producer<A>() { public A createFromParcel(Parcel in) { A instance = new A(); instance.unmarshalling(in); return instance; } }; @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; A a1 = (A) o; return a == a1.a && b == a1.b && c == a1.c; } @Override public int hashCode() { return Objects.hash(a, b, c); } @Override public String toString() { return "A{" + "a=" + a + ", b=" + b + ", c=" + c + '}'; }
4.2 B类用于存放A的实体类集合,代码如下
public static class B implements Sequenceable { private List<A> list; private B() { } private B(List<A> list) { this.list = list; } @Override public boolean hasFileDescriptor() { return false; } @Override public boolean marshalling(Parcel out) { out.writeSequenceableList(list); return true; } @Override public boolean unmarshalling(Parcel in) { in.addAppClassLoader(getClass().getClassLoader()); list = in.readSequenceableList(A.class); return true; } public static final Sequenceable.Producer<B> PRODUCER = new Sequenceable.Producer<B>() { public B createFromParcel(Parcel in) { B instance = new B(); instance.unmarshalling(in); return instance; } }; @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; B b = (B) o; return Objects.equals(list, b.list); } @Override public int hashCode() { return Objects.hash(list); } }
需要注意的是我们需要调用addAppClassLoader方法,这个地方比较容易出错,如下图
4.3新建abilitySlice ,然后在xml写一个控件用于存读Parcel中数据,xml代码如下
<?xml version="1.0" encoding="utf-8"?> <DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:height="match_parent" ohos:width="match_parent" ohos:orientation="vertical"> <Text ohos:id="$+id:bt1" ohos:height="100vp" ohos:background_element="#Ed6262" ohos:width="match_parent" ohos:text_alignment="center" ohos:text_size="30fp" ohos:text_color="#ffffff" ohos:text="存储数据"/> <Text ohos:top_margin="10vp" ohos:id="$+id:Result" ohos:height="100vp" ohos:multiple_lines="true" ohos:width="match_parent" ohos:text_alignment="center|left" ohos:text_size="20fp" ohos:text_color="#ed6262" /> </DirectionalLayout>
4.4实现点击按钮事件,然后存读数据,代码如下
findComponentById(ResourceTable.Id_bt1).setClickedListener(new Component.ClickedListener() { @Override public void onClick(Component component) { List<A> list = new ArrayList<>(); A a = new A(1, 2, 3); A a2 = new A(2, 2, 3); A a3 = new A(3, 2, 3); list.add(a); list.add(a2); list.add(a3); B b = new B(list); Parcel parcel = Parcel.create(); parcel.writeSequenceable(b); B b1 = new B(); parcel.readSequenceable(b1); StringBuilder stringBuilder=new StringBuilder(); if (b1.list.size() > 0) { for (int i = 0; i < b1.list.size(); i++) { stringBuilder.append(" b1.list====>" + b1.list.get(i).toString()); stringBuilder.append("\n"); } } mResult.setText(stringBuilder.toString()); } });
-
运行效果
全部代码如下
5.1xml<DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:height="match_parent" ohos:width="match_parent" ohos:orientation="vertical"> <Text ohos:id="$+id:bt1" ohos:height="100vp" ohos:background_element="#Ed6262" ohos:width="match_parent" ohos:text_alignment="center" ohos:text_size="30fp" ohos:text_color="#ffffff" ohos:text="存储数据"/> <Text ohos:top_margin="10vp" ohos:id="$+id:Result" ohos:height="100vp" ohos:multiple_lines="true" ohos:width="match_parent" ohos:text_alignment="center|left" ohos:text_size="20fp" ohos:text_color="#ed6262" /> </DirectionalLayout>
5.2 java 代码
package com.harmony.alliance.mydemo.slice; import com.harmony.alliance.mydemo.ResourceTable; import ohos.aafwk.ability.AbilitySlice; import ohos.aafwk.content.Intent; import ohos.agp.components.Component; import ohos.agp.components.Text; import ohos.utils.Parcel; import ohos.utils.Sequenceable; import java.util.*; public class ParcelTestSlice extends AbilitySlice { private Text mResult; @Override protected void onStart(Intent intent) { super.onStart(intent); setUIContent(ResourceTable.Layout_slice_main2); mResult= (Text) findComponentById(ResourceTable.Id_Result); findComponentById(ResourceTable.Id_bt1).setClickedListener(new Component.ClickedListener() { @Override public void onClick(Component component) { List<A> list = new ArrayList<>(); A a = new A(1, 2, 3); A a2 = new A(2, 2, 3); A a3 = new A(3, 2, 3); list.add(a); list.add(a2); list.add(a3); B b = new B(list); Parcel parcel = Parcel.create(); parcel.writeSequenceable(b); B b1 = new B(); parcel.readSequenceable(b1); StringBuilder stringBuilder=new StringBuilder(); if (b1.list.size() > 0) { for (int i = 0; i < b1.list.size(); i++) { stringBuilder.append(" b1.list====>" + b1.list.get(i).toString()); stringBuilder.append("\n"); } } mResult.setText(stringBuilder.toString()); } }); } public static class B implements Sequenceable { private List<A> list; private B() { } private B(List<A> list) { this.list = list; } @Override public boolean hasFileDescriptor() { return false; } @Override public boolean marshalling(Parcel out) { out.writeSequenceableList(list); return true; } @Override public boolean unmarshalling(Parcel in) { in.addAppClassLoader(getClass().getClassLoader()); list = in.readSequenceableList(A.class); return true; } public static final Sequenceable.Producer<B> PRODUCER = new Sequenceable.Producer<B>() { public B createFromParcel(Parcel in) { B instance = new B(); instance.unmarshalling(in); return instance; } }; @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; B b = (B) o; return Objects.equals(list, b.list); } @Override public int hashCode() { return Objects.hash(list); } } public static class A implements Sequenceable { private int a; private int b; private int c; public A() { this(0, 0, 0); } public A(int a, int b, int c) { this.a = a; this.b = b; this.c = c; } @Override public boolean hasFileDescriptor() { return false; } @Override public boolean marshalling(Parcel out) { out.writeInt(a); out.writeInt(b); out.writeInt(c); return true; } @Override public boolean unmarshalling(Parcel in) { a = in.readInt(); b = in.readInt(); c = in.readInt(); return true; } public static final Sequenceable.Producer<A> PRODUCER = new Sequenceable.Producer<A>() { public A createFromParcel(Parcel in) { A instance = new A(); instance.unmarshalling(in); return instance; } }; @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; A a1 = (A) o; return a == a1.a && b == a1.b && c == a1.c; } @Override public int hashCode() { return Objects.hash(a, b, c); } @Override public String toString() { return "A{" + "a=" + a + ", b=" + b + ", c=" + c + '}'; } } }
5.3效果如下
更多相关学习资料:
https://developer.huawei.com/consumer/cn/forum/topic/0201785060053960095?fid=0101562279236410779?ha_source=zzh
相关文章
- 深入java面向对象五:Java的内存管理
- MySQL_(Java)【连接池】简单在JDBCUtils.java中创建连接池
- Java实现 蓝桥杯VIP 算法训练 sign函数
- Java实现 LeetCode 142 环形链表 II(二)
- Java实现 蓝桥杯 算法提高 概率计算
- Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
- 【刷题】Java面向对象概述
- 【JAVA】Java循环语句中的continue跳转进入下一次循环是否判断循环条件
- java.lang.OutOfMemoryError: Java heap space 解决方法
- java 11 标准Java异步HTTP客户端
- 【JAVA】java编译错误:编码UTF8/GBK的不可映射字符
- Java超类-java.lang.object
- 当年的Java考试:JAVA&移动应用&大数据-大三-社区疫苗接种管理系统(全部源码·保姆式呵护)
- Simple Logging Facade for Java (SLF4J)作用(java日志框架)
- Java HashSet
- 【Java】java中javaSE与javaEE的区别
- java死锁(Java-level deadlock)
- Java如何获取IP属地 ip2region failed to create searcher with x:java.io.FileNotFoundException:( 系统找不到指定的路径)
- Java Logger(java日志)
- 精选30道Java笔试题解答
- java-信息安全(十二)-数字证书、CA证书【Java证书体系实现】
- Java垃圾回收机制以及内存泄露
- Java程序猿从笨鸟到菜鸟之(九十二)深入java虚拟机(一)——java虚拟机底层结构具体解释
- 【Java面试】Kafka 怎么避免重复消费
- java - 详解 Java 17 中新推出的密封类
- 【java】Java 内存模型
- 单链表(Java每日一题)
- JAVA开发讲义(一)-Java的自白