【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;}@Overridepublic boolean hasFileDescriptor() { return false;}@Overridepublic boolean marshalling(Parcel out) { out.writeInt(a); out.writeInt(b); out.writeInt(c); return true;}@Overridepublic boolean unmarshalling(Parcel in) { a = in.readInt(); b = in.readInt(); c = in.readInt(); return true;}public static final Sequenceable.Producer PRODUCER = new Sequenceable.Producer() { public A createFromParcel(Parcel in) { A instance = new A(); instance.unmarshalling(in); return instance; }};@Overridepublic 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;}@Overridepublic int hashCode() { return Objects.hash(a, b, c);}@Overridepublic String toString() { return "A{" + "a=" + a + ", b=" + b + ", c=" + c + '}';}
4.2 B类用于存放A的实体类集合,代码如下
public static class B implements Sequenceable { private List list; private B() { } private B(List 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 PRODUCER = new Sequenceable.Producer() { 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代码如下
4.4实现点击按钮事件,然后存读数据,代码如下
findComponentById(ResourceTable.Id_bt1).setClickedListener(new Component.ClickedListener() { @Override public void onClick(Component component) { List 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.get(i).toString()); stringBuilder.append("\n"); } } mResult.setText(stringBuilder.toString()); } });
-
运行效果
全部代码如下
5.1xml5.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 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.get(i).toString()); stringBuilder.append("\n"); } } mResult.setText(stringBuilder.toString()); } }); } public static class B implements Sequenceable { private List list; private B() { } private B(List 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 PRODUCER = new Sequenceable.Producer() { 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 PRODUCER = new Sequenceable.Producer() { 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