> 文档中心 > 【Harmony OS】【JAVA UI】鸿蒙系统中怎么使用Parcel进行存储数据或数据传递

【Harmony OS】【JAVA UI】鸿蒙系统中怎么使用Parcel进行存储数据或数据传递

  1.  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. 方法介绍

    2.1 addAppClassLoader(ClassLoader newClassLoader)public void addAppClassLoader(ClassLoader newClassLoader)添加第三方ClassLoader用于实例初始化。如果您需要封装或取消封装自定义序列化数据,请添加您自己的ClassLoader。

    2.2 writeSequenceablepublic final void writeSequenceable(Sequenceable val)将可序列化对象写入Parcel实例。其余的方法参考文档Parcel资料

  3. 封装Sequenceable实体类我们参考Sequenceable资料

  4. 动手实践

    今天将一个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. 运行效果
    全部代码如下
    5.1xml

            

    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 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

医疗百科