Kali ini singkat saja.

Apa itu Parcelable object ?

Ketika mendengar kata parcel, apa yang ada di benak kalian? Apakah seperti parcel yang biasa diberikan dari satu orang ke orang lain, pada saat lebaran? Yeah, yang dimaksud dengan parcelable di sini kurang lebih sama dengan istilah “parcel” di dunia nyata.

Parcelable adalah suatu interface pada pemrograman Android, yang memungkinkan suatu instansi dari kelas/objek untuk bisa disimpan dan diambil kembali dari sebuah Parcel. Sedangkan Parcel sendiri merupakan suatu kontainer untuk menampung kelas tersebut.

Salah satu ciri dari suatu kelas yang mengimplementasikan interface Parcelable adalah adanya static field bernama CREATOR, yang berfungsi untuk meng-generate objek yang memakai interface Parcelable itu.

Model kelas yang mengimplementasikan Parcelable adalah sebagai berikut :

public class MyParcelable implements Parcelable {
     private int mData;

     public int describeContents() {
         return 0;
     }

     public void writeToParcel(Parcel out, int flags) {
         out.writeInt(mData);
     }

     public static final Parcelable.Creator<MyParcelable> CREATOR
             = new Parcelable.Creator<MyParcelable>() {
         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();
     }
 }

Hal itu berarti apabila kalian ingin membuat sebuah Parcelable objek, kalian harus mengikuti model di atas. Dengan menambah-nambahkan field yang sesuai dengan kebutuhan kalian.

Kegunaan

Lantas, apa sih gunanya Parcelable objek? Gunanya banyak, salah satu yang paling penting adalah seperti deskripsi sebuah parcel di dunia nyata. Yaitu Parcelable objek  bisa diserahkan (passed) dari satu Activity ke Activity lainnya.

Dan tidak hanya objek biasa yang bisa diserahkan/dipassingkan ke Activity lain. Kegunaan utama dari Parcelable adalah untuk melewatkan sebuah objek yang rumit, seperti sebuah ArrayList yang berisi objek tertentu.

Praktek nyata implementasi Parcelable saya lakukan ketika ingin mem-passing ArrayList yang berisi objek DBLokasi pada tutorial membuat aplikasi location based service ke Activity lain.

Jika biasanya untuk melewatkan suatu value, katakanlah integer, atau String atau Double dari satu Activity ke Activity lain di Android, kita cukup menggunakan fungsi put…() pada Bundle dan menggunakan fungsi get…() pada Activity satunya untuk mendapatkan value yang tadi kita lewatkan. Namun karena yang mau dilewatkan ini lumayan kompleks, maka harus digunakan suatu siasat.

Pertama saya mengimplementasikan interface Parcelable pada kelas DBLokasi. DBLokasi adalah kelas yang merepresentasikan lokasi di dunia nyata, karena saya ingin menampilkan banyak lokasi pada peta. Maka saya masukkan instansi dari DBLokasi ke dalam sebuah ArrayList, sehingga nantinya ada sebuah ArrayList yang menampung daftar DBLokasi.

Kode DBLokasi.java yang sudah dimodifikasi adalah seperti berikut. Perhatikan bahwa kelas DBLokasi di bawah ini tetap megikuti aturan dari model kelas yang mengimplementasikan Parcelable seperti di atas :

package id.attwhx.twmaps;

import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;

public class DBLokasi implements Parcelable{

	private long id;
	private String lat;
	private String lng;

	public DBLokasi()
	{

	}

	public DBLokasi(Parcel in)
	{
	    lat = in.readString();
	    lng = in.readString();
	    id = in.readLong();
	}

	public long getId() {
	    return id;
	  }

	  public void setId(long id) {
	    this.id = id;
	  }

	  // Will be used by the ArrayAdapter in the ListView
	  @Override
	  public String toString() {
	    return "Lokasi ke "+id+" ("+lat+" , "+lng+")";
	  }

	public String getLat() {
		return lat;
	}

	public void setLat(String lat) {
		this.lat = lat;
	}

	public String getLng() {
		return lng;
	}

	public void setLng(String lng) {
		this.lng = lng;
	}

	public static final Parcelable.Creator<DBLokasi> CREATOR = new Parcelable.Creator<DBLokasi>()
   {
         public DBLokasi createFromParcel(Parcel in)
         {
            Log.d ("TAG", "createFromParcel()");
             return new DBLokasi(in);
         }

         public DBLokasi[] newArray (int size)
         {
            Log.d ("TAG", "createFromParcel() newArray ");
             return new DBLokasi[size];
         }
    };

	public int describeContents() {
		// TODO Auto-generated method stub
		return 0;
	}

	public void writeToParcel(Parcel parcel, int index) {
		// TODO Auto-generated method stub
		parcel.writeString(lat);
		parcel.writeString(lng);
		parcel.writeLong(id);
	}
}

Beberapa method ditambahkan pada kelas DBLokasi supaya sesuai dengan aturan model kelas di atas.

Sekarang gimana cara melewatkannya ke Activity lain ? Saya menggunakan fungsi dari putParcelableArrayList() yang ada pada Bundle. Kemudian paket Bundle tersebut disertakan ke dalam Intent. Untuk kemudian diserahkan ke Activity lain. 🙂

Potongan kode lengkapnya seperti ini :

ArrayList<DBLokasi> lokasi2 = datasource.getAllLokasi();
				Bundle b = new Bundle();
				Intent i = new Intent(this,TWMaps.class);
		    	b.putParcelableArrayList("daftar", lokasi2);
		    	i.putExtras(b);
		    	startActivity(i);

Setelah sampai di Activity satunya, objek yang di-parcel kan itu diambil menggunakan fungsi getParcelableArrayList(). Seperti kode di bawah ini.

ArrayList<DBLokasi> daftarLokasi = b.getParcelableArrayList("daftar");


Download aplikasi kami di Google Play Store