[Android] android.os.Parcelable / Parcel

| トラックバック(0) |

android.osパッケージのParcelableは、
(Parcelクラスから)インスタンスを読み書きするためのインターフェースです。

例えば、アクティビティ(Activity)間で、データを渡したい場合、
Intent.putExtra()などで、ほとんどのデータ型を格納することができますが、

Parcelableインタフェースを実装しているクラスであれば、そのインスタンスも、
putExtra(String name, Parcelable value)を呼び出すことで、インスタンスごと渡すことができます。
※「Parcel」は日本語に直訳すると「小包」。なんとなくイメージできますね。

では、Parcelableインタフェースを実装するには、どうすればよいかというと、
下記のような実装を追加するだけでよいです。

※ソースコードは、公式のヘルプ(http://code.google.com/intl/ja/android/reference/android/os/Parcelable.html)を引用したものです。

 public class MyParcelable implements Parcelable {
     private int mData;
     
     public void writeToParcel(Parcel out, int flags) {
         out.writeInt(mData);
     }

     public static final Parcelable.Creator CREATOR
             = new Parcelable.Creator() {
         public MyParcelable createFromParcel(Parcel in) {
             return new MyParcelable(in);
         }

         public MyParcelable[] newArray(int size) {
             return new MyParcelable[size];
         }
     }
     
     private MyParcelable(Parcel in) {
         mData = in.readInt();
     }
 }

具体的には、

コンストラクタ(Parcel in)では、データの読み込み(復元)処理を追加します。

例えば、この例では、int型のメンバ変数を読み込みたいので、in.readInt()を呼び出します。

※ArrayList<XXX>の場合には、Parcel.createTypedArrayList(XXX.CREATOR)を呼び出す。
※メンバ変数が、独自のクラスの場合にも、同クラスでParcelalbeを実装し、
読み込みたいところで、Parcel.readParcelable(ClassLoader loader)を呼び出す。
ClassLoader loaderは、XXX.class.getClassLoader()で取得できます。

次に必要となるのが、書き込みですが、こちらはwriteToParcel()に処理を追加します。

追加する内容は、読み込みとペアで、readをwriteに書き換えていきます。

※ArrayList<XXX>の場合には、Parcel.writeTypedList()を呼び出す。
※Parcelalbeを実装したクラスを書きだすには、Parcel.writeParcelable(Parcel dest, int flags)を呼び出す。

※余談:感のよい方であれば、直列化/シリアライズ(Serialization)を想像されたと思いますが、
Parcelクラスは、あくまでもデータの永続化が(General)目的ではなく、
IPC(プロセス間通信)でハイパフォーマンスを得るためにデザインされたものだそうです。

関連記事

トラックバック(0)

トラックバックURL: http://mt.adakoda.com/mt-tb.cgi/59

Android Advent Calendar 2011

2012年2月

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29