[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(プロセス間通信)でハイパフォーマンスを得るためにデザインされたものだそうです。

[Eclipse] 不要なimportの削除

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

Eclipseで、ソースコードを開いている時に、[Source]メニュー > [Organize Imports]をクリックすると、
不要なimportを削除することができます。

※Eclipse3.4 & Windowsの場合、Ctrl+Shift+Oキーでも同様。

Eclipseで、ソースコードを開いている時に、[Source]メニュー > [Format]をクリックすると、
ソースコードを整形することができます。

※Eclipse3.4 & Windowsの場合、Ctrl+Shift+Fキーでも同様。
※ソースコード整形のルールは、[Projects]メニュー > [Properties] > [Java Code Style] > [Formatter]から参照/変更できます。

  1. Windowメニュー > Preferences を選択
  2. (Preferences画面の)左側のAndroidを選択
  3. SDK LocationにSDKディレクトリを直接入力するか、Browse...をクリックしてディレクトリを選択
  4. Apply、OKをクリック

Android SDKディレクトリは、以下の(Windowsの例の)ようにSDKバージョン毎に分けて置いておくとよいでしょう。
C:\Android\android-sdk-windows-1.0_r1 ・・・ Android 1.0 SDK, Release 1
C:\Android\android-sdk-windows-1.0_r2 ・・・ Android 1.0 SDK, Release 2

[Android] Cursor.close()

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

Thread内でSQLのquery操作をして、戻り値のCursolを参照するようなコードを書いていた際、

タイミングによっては、

Daemon System Thread [<5> HeapWorker] (Suspended (exception IllegalStateException)) 
 SQLiteCursor.finalize() line: 448 
 NativeStart.run() line: not available [native method]

のようなIllegalStateExceptionが発生しており、少しハマってしまいました。。。

解決方法は、Threadが終了するよりも前、かつ、DataBaseを閉じる前に

Cursol.close()

を挿入するだけでした。

たしかに、考えてみれば当然の流れですね。

<<前のページへ 7273747576777879808182

2012年6月

          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 30