美文网首页
android 数据封装类-Parcelable 使用和学习

android 数据封装类-Parcelable 使用和学习

作者: JeremyDai | 来源:发表于2016-06-18 15:01 被阅读538次

    概述

    我们在应用层使用会遇到需要进行数据传输的时候,通常都是使用的intent方式,如果使用基本点的数据类型(String\int\boolean)都是可以直接传的,但是如果传输的数据是一个类的话,下面的方式就不行了。Parcelable在android当中通常用的intent和binder通信当中,通常通过读和写的方式来进行服务器和客户端的通信(数据传输)。这个是android专有的类型

    
    //在第一个Activity中向Intent中加入内容String data = "Hello,SecondActivity.class");
    Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
    intent.putExtra("key","我的数据");
    startActivity(intent);
    //在第二个Activity中,取出Intent中的内容
    Intent intent = getIntent();
    String data = intent.getStringExtra("alarm");
    
    

    在java当中也是有这么一种类型的叫Serializable,它是javaSE本身就支持的序列化接口,但是使用这个接口来进行序列化有一个缺点,因为这个的序列化和樊序列化也就是读写需要达大量的IO操作,从而是的效率大大降低,但它也是有优点的就是使用起来非常的方便,只要implement Serializable即可,细听会自动帮你序列化和反序列化, 所以鱼和熊掌不可兼得。所以android设计了另外一个接口Parcelable。parcelable定义了把数据写入parcel和从parcel读出数据的接口,一个类的实例,如果需要封装到消息中去,就必须实现这一接口,如果实现了这个接口,该类的实例就是可以“被打包”。parcelable使用起来就相对麻烦一些。

    这个时候我们也会问为什么要序列化呢,序列化能给我们带来什么好处呢?

    • 永久行的保存对象,保存对象的字节的序列到本地文件道中;
    • 通过序列化对象在网络中传输
    • 通过序列化对象在进程间通信

    看看 Parcelable 接口里面是什么东东,

    public interface Parcelable 
    {
        //内容描述接口,可以不做任何操作,直接return 0即可;
        public int describeContents();
        //写入接口函数,打包
        public void writeToParcel(Parcel dest, int flags);
        //读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入
        //为了能够实现模板参数的传入,这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例
        public interface Creator<T> 
        {
               public T createFromParcel(Parcel source);
               public T[] newArray(int size);
        }
    }
    

    实现Parcelable步骤

    • 首先 必须要 implement Parcelable
    • 重写describeContents方法,内容接口描述,默认返回0就可以
    • 重写writeToParcel 方法,将你的对象序列化为一个Parcel对象,即:将类的数据写入外部提供的Parcel中,打包需要传递的数 据到Parcel容器保存,以便从 Parcel容器获取数据;
    • 实例化静态内部对象CREATOR实现接口Parcelable.Creator:

    实现了的例子

    package com.xxx.storybox.model;
    
    
    import android.os.Parcel;
    import android.os.Parcelable;
    
    
    public class ApplicationMusicItem implements Parcelable {
    
        public static final int MUSIC_TYPE_LOCAL = 0;
        public static final int MUSIC_TYPE_REMOTE = 1;
        public static final int MUSIC_TYPE_CLOUD = 2;
    
        // common
        protected int type;
        protected String title;
        protected String url;
        protected String artist;
        protected String album;
        protected String albumArt;
        protected String genre;
        protected int duration;
        protected boolean isChecked = false;
        protected static int mMemberSize = 9;
    
        public ApplicationMusicItem() {
    
        }
    
        public static int memberSize() {
            return mMemberSize;
        }
    
        public void setType(int type) {
            this.type = type;
        }
    
        public int getType() {
            return type;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getTitle() {
            return title;
        }
    
        public void setArtist(String artist) {
            this.artist = artist;
        }
    
        public String getArtist() {
            return artist;
        }
    
        public void setAlbum(String album) {
            this.album = album;
        }
    
        public String getAlbumArt() {
            return albumArt;
        }
        public void setAlbumArt(String albumArt) {
            this.albumArt = albumArt;
        }
    
        public String getAlbum() {
            return album;
        }
    
        public void setGenre(String genre) {
            this.genre = genre;
        }
    
        public String getGenre() {
            return genre;
        }
    
        public void setDuration(int duration) {
            this.duration = duration;
        }
    
        public int getDuration() {
            return duration;
        }
        public void setUrl(String url) {
            this.url = url;
        }
    
        public String getUrl() {
            return url;
        }
    
        public static int transactionMemberSize() {
            return mMemberSize;
        }
    
        public static ApplicationMusicItem createFromTransactionArray(String[] array) {
            ApplicationMusicItem entry = new ApplicationMusicItem();
            entry.title = array[0];
            entry.url = array[1];
            entry.artist = array[2];
            entry.album = array[3];
            entry.albumArt = array[4];
            entry.genre = array[5];
            entry.duration = Integer.valueOf(array[6]);
            return entry;
        }
    
        public String[] toTransactionArray() {
            String[] array = new String[transactionMemberSize()];
            array[0] = title;
            array[1] = url;
            array[2] = artist;
            array[3] = album;
            array[4] = albumArt;
            array[5] = genre;
            array[6] = Integer.toString(duration);
            return array;
        }
    
        protected ApplicationMusicItem(Parcel in) {
            this();
    
            type = in.readInt();
            title = in.readString();
            artist = in.readString();
            album = in.readString();
            genre = in.readString();
            duration = in.readInt();
        }
    
        public int describeContents() {
            return 0;
        }
    
        public void writeToParcel(Parcel out, int flags) {
            out.writeInt(type);
            out.writeString(title);
            out.writeString(url);
            out.writeString(artist);
            out.writeString(album);
            out.writeString(albumArt);
            out.writeInt(duration);
            out.writeString(genre);
            out.writeString(albumArt);
        }
    
        public static final Creator<ApplicationMusicItem> CREATOR = new Creator<ApplicationMusicItem>() {
            public ApplicationMusicItem createFromParcel(Parcel in) {
                return new ApplicationMusicItem(in);
            }
    
            public ApplicationMusicItem[] newArray(int size) {
                return new ApplicationMusicItem[size];
            }
        };
    
        @Override
        public String toString() {
            return "MusicItem{" +
                    "type=" + type +
                    ", title='" + title + '\'' +
                    ", url='" + url + '\'' +
                    ", artist='" + artist + '\'' +
                    ", album='" + album + '\'' +
                    ", albumArt='" + albumArt + '\'' +
                    ", genre='" + genre + '\'' +
                    ", duration=" + duration +
                    ", isChecked=" + isChecked +
                    '}';
        }
    }
    
    

    如何使用:

    Intent intent = new Intent(A.class,B.class);
    Bundle bundle = new Bundle();
    bundle.putParcelable("contentNavInfo", contentNavInfo);
    intent.putExtras(bundle);
    

    相关文章

      网友评论

          本文标题:android 数据封装类-Parcelable 使用和学习

          本文链接:https://www.haomeiwen.com/subject/jdtbdttx.html