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

2016-06-18  本文已影响538人  JeremyDai

概述

我们在应用层使用会遇到需要进行数据传输的时候,通常都是使用的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步骤

实现了的例子

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);
上一篇下一篇

猜你喜欢

热点阅读