精华内容
下载资源
问答
  • Parcelable

    2020-08-12 11:43:46
    在代码中implements Parcelable的作用是什么呢?? Android开发,无法将对象的引用传递给Activity或Fragment,需要将对象放到Intent或者Bundle里,然后再传递。即,将对象转换为可传输的二进制流的过程从而进行传输...

    在代码中implements Parcelable的作用是什么呢??

    参考:https://blog.csdn.net/javazejian/article/details/52665164?utm_medium=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.channel_param

    Parcelable是Android为我们提供的序列化的接口,Parcelable相对于Serializable的使用较为复杂一些,但是Parcelable的效率也相对较高。对比Parcelable vs Serializable

    Android源码中的Parcelable

    /**
         * Interface for classes whose instances can be written to
       * and restored from a {@link Parcel}.  Classes implementing the Parcelable
     * interface must also have a non-null static field called <code>CREATOR</code>
     * of a type that implements the {@link Parcelable.Creator} interface.
     * 
     * <p>A typical implementation of Parcelable is:</p>
     * 
     * <pre></pre>
     * */
     * public class MyParcelable implements Parcelable {
     *     private int mData;
     *
     *	  //-----当前对象的内容描述,一般返回0即可-----
     *       public int describeContents() {
     *         return 0;
     *     }
     *	 //-----将当前对象写入序列化结构中-----
     *     public void writeToParcel(Parcel out, int flags) {
     *         out.writeInt(mData);
     *     }
     *	 //-----public static final一个都不能少,内部对象CREATOR的名称也	不能改变,必须全部大写。-----
     *     public static final Parcelable.Creator<MyParcelable> CREATOR
     *             = new Parcelable.Creator<MyParcelable>() {
     * 
     * 		  //实现从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层..从序列化后的对象中创建原始对象
     *         public MyParcelable createFromParcel(Parcel in) {
     *             return new MyParcelable(in);
     *         }
     *
     *		  //创建一个类型为T,长度为size的数组,供外部类反序列化本类数组使用
     *         public MyParcelable[] newArray(int size) {
     *             return new MyParcelable[size];
     *         }
     *     };
     *     
     *     private MyParcelable(Parcel in) {
     *         mData = in.readInt();
     *     }
     * }
    

    从代码可知,在序列化的过程中需要实现的功能有 序列化反序列 以及 内容描述

    • writeToParcel 方法实现序列化功能,其内部是通过Parcel的一系列write方法来完成的
    • CREATOR内部对象来实现反序列化,其内部是通过createFromParcel方法来创建序列化对象并通过newArray方法创建数组,最终利用Parcel的一系列read方法完成反序列化
    • 最后由describeContents完成内容描述功能,改方法一般返回0,仅当对象中存在文件描述符时返回1.

    可以将Parcel看作是类似于Serlizable的读写流,通过writeToParcel把对象写到流里面,再通过createFromParcel从流里读取对象,这个过程需要我们自己来实现,且写的顺序和读的顺序必须一致。

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,350
精华内容 2,140
关键字:

parcelable