«

»

Oct 14

שימוש ב Parcelable


 Parcelable:

 

רקע תאורטי:

 

כאשר יש לנו אובייקט ואנחנו רוצים להעביר אותו בין צד אחד לצד שני שאין לו גישה לאובייקט בזיכרון של הצד הראשון.

 

לדוגמה:

כאשר רוצים להעביר אובייקט ב intent בין Activities.

כאשר רוצים להעביר אובייקט בין process-ים שונים דרך IPC – InterProcess Communication.

 

התהליך הזה נקרא Marshalling/Unmarshalling או ב java זה נקרא Serialization/Deserialization.

והוא למעשה הפיכה של הייצוג בזיכרון של האובייקט ל stream של bytes שהצד השני קורא ויכול מה stream הזה לבנות מחדש עותק של האובייקט.

ההפיכה של הייצוג בזיכרון של האובייקט נעשת על ידי שיטוחו ופירוקו לכל הפרימיטיביים שמרכיבים אותו ואז הפיכתם בסדר מסוים (הסדר הזה חשוב) ל stream של bytes.

האובייקט צריך גם להגדיר בנאי שמקבל את הפרימיטיביים הללו שנוצרים ע”י ה stream של ה bytes (ההפיכה הזאת היא לא באחריות המתכנת) ובונה את עצמו מחדש.

יש לשים לב שהאובייקט שאנחנו מקבלים בצד השני הוא לא אותו אובייקט ששלחנו, הוא לא מצביע לאותו מקום בזיכרון אלא רק עותק של האובייקט. ולכן שינויים בו לא ישפיעו על האובייקט המקורי וגם ה hash code שלו לא יהיה שווה למקורי (עם כל מה שמשתמע מכך בנושא של HashMap, ArrayList וכו’)

 

דוגמה והסבר:

 

בשביל להעביר אובייקט ראשית מממשים את הממשק Parcelable:

public class ParcelableClass implements Parcelable{

	int _a = 1;
	int _b = 2;
	String _s = new String("string");
נצטרך לממש 2 מתודות:
describeContents() – לא רלוונטי.
	
	@Override
	public int describeContents() {

		return 0;

	}

WriteToParcel – פה אנחנו שומרים את המידע הגולמי של המחלקה שלנו (סריאליזציה), יש לשים לב! יש חשיבות לסדר הכתיבה ל dest, סדר הקריאה שנציין בהמשך יהיה חייב להתאים לסדר הכתיבה שאנו קובעים כעת:

	@Override
	public void writeToParcel(Parcel dest, int flags) {

		dest.writeInt(_a);
		dest.writeInt(_b);
		dest.writeString(_s);

}
אחרי שקבענו איך לעשות את הסריאליזציה, אנחנו צריכים לקבוע איך נעשה את הדה-סריאליזציה.

צריך להגדיר משתנה static final בשם CREATOR מסוג הממשק Parcelable.Creator. ואז ליצור לו מימוש ולממש את שתי המתודות שלו.

 

ה creator:

public static final Parcelable.CreatorCREATOR = new Parcelable.Creator() {

להחזיר מופע של המחלקה שלנו לפי איך שעשינו את ה writeToParcel:

	@Override
	public ParcelableClass createFromParcel(Parcel source) {

		return new ParcelableClass(source);

	}

להחזיר מערך של המחלקה:

	@Override
	public ParcelableClass[] newArray(int size) {

		return new ParcelableClass[size];

	}

        };
עכשיו אנחנו צריכים לכתוב בנאי שמקבל את ה Parcel ובונה את האובייקט ממנו.
יש לשים לב שהמתודה in.read קוראת את המשתנים לפי הסדר שכתבנו אותם במתודה writeToParcel ולכן הסדר חשוב.
	private ParcelableClass(Parcel in) {

		_a = in.readInt();
		_b = in.readInt();
		_s = in.readString();

	}

}

כעת יש לנו מחלקה שאפשר לפרק ולבנות אותה מחדש.

 

בהצלחה !

Leave a Reply

Your email address will not be published.

אתם יכולים להשתמש באפשרויות ותגי ה-HTMLהבאים: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>