View Full Version : Parcelable در آندروید چیست؟
esideli
جمعه 01 اسفند 1393, 19:16 عصر
سلام،
کسی میدونه Parcelable توی آندروید چیه و طرز کارش چیه؟
منظورم اینه توی کلاسی که از پارسِبل implements شده Creator چی کار می کنه و یا متد writeToParcel و describeContents چطوری عمل می کنن؟ متدی که شبیه سازنده کلاس هست ولی ورودیش Parcel هست چه کار می کنه؟ توی برنامم دارم ازش استفاده می کنم (برای دسترسی به مقادیر گرفته شده از دیتابیس) ولی برام گنگه و نحوه کارش رو نمی دونم. فقط می دونم یه اینترفیس باید باشه یعنی کلاسی که متد هاش بدون بدنه هسنتد.
مرسی.
esideli
شنبه 02 اسفند 1393, 03:26 صبح
دوستان کسی نیست کمکی کنه؟
Nevercom
شنبه 02 اسفند 1393, 16:09 عصر
برای اینکه بتونه یک شئ جاوا (POJO) رو بین اکتیویتی ها جابجا کنید، نیاز هست که قابل تبدیل به Parcel باشه، تا اندروید بتونه جابجاش کنه.
وقتی شما اینترفیس Parcelable رو implement می کنید و فیلدهایی که باید جابجا بشن رو بهش معرفی کنید، می تونید اون شئ رو همراه با Intentارسال کنید و در اکتیویتی دوم به شکل Java Object دریافتش کنید.
اگر از این روش استفاده نکنید، بعنوان مثال باید فیلدها رو خودتون به شکل String ارسال کنید، که دردسر بیشتری داره.
esideli
شنبه 02 اسفند 1393, 18:07 عصر
جناب Nevercom (http://barnamenevis.org/member.php?89707-Nevercom) ممنونم الان کار اصلیش رو فهمیدم. میشه در مورد متد هایی که گفتم و مراحل نوشن و خوندن اطلاعات از این کلاس هم یه توضیحی بدین؟
این هم کدی که دارم ازش استفاده می کنم و بدون مشکل هم کار می کنه و می خوام بدونم هنگام دادن و گرفتن اطلاعات از این کلاس ترتیب کار به چه شکلی هست. منظورم اون متد های set و get در ابتدای کلاس نیست. و اینکه ترتیب توی متد writeToParcel و DBOneRow(Parcel in) مهمه؟
مرسی.
public class DBOneRow implements Parcelable {
private int id, fav;
private String sub, name, comment, pic, extra;
public DBOneRow() {
}
//--------------------------------------------------
public void setId(int id){
this.id = id;
}
public int getId(){
return id;
}
//--------------------------------------------------
public void setFav(int fav){
this.fav = fav;
}
public int getFav(){
return fav;
}
//--------------------------------------------------
public void setSub(String sub){
this.sub = sub;
}
public String getSub(){
return sub;
}
//--------------------------------------------------
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
//--------------------------------------------------
public void setComment(String comment){
this.comment = comment;
}
public String getComment(){
return comment;
}
//--------------------------------------------------
public void setPic(String pic){
this.pic = pic;
}
public String getPic(){
return pic;
}
//--------------------------------------------------
public void setExta(String extra){
this.extra = extra;
}
public String getExtra(){
return extra;
}
//--------------------------------------------------
public DBOneRow(Parcel in){
id = in.readInt();
fav = in.readInt();
sub = in.readString();
name = in.readString();
comment = in.readString();
pic = in.readString();
extra = in.readString();
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel x, int arg1) {
// TODO Auto-generated method stub
x.writeInt(id);
x.writeInt(fav);
x.writeString(sub);
x.writeString(name);
x.writeString(comment);
x.writeString(pic);
x.writeString(extra);
}
public static final Parcelable.Creator<DBOneRow> myCreator = new Parcelable.Creator<DBOneRow>() {
@Override
public DBOneRow createFromParcel(Parcel arg0) {
// TODO Auto-generated method stub
return new DBOneRow(arg0);
}
@Override
public DBOneRow[] newArray(int arg0) {
// TODO Auto-generated method stub
return new DBOneRow[arg0];
}
};
}
Nevercom
شنبه 02 اسفند 1393, 19:36 عصر
بعد از اضافه کردن این کدها، بصورت مستقیم از این متدها استفاده ای نمی کنیم. این برای این هست که اندروید بتونه کار لازم برای تبدیل به/از Parcel رو انجام بده.
اما درکل دو متد writeToParcel و DBOneRow اهمیت دارن. اولی برای تبدیل کلاس به Parcel و دومی Constructorی هست که Parcel مربوطه رو به کلاس DBOneRow تبدیل می کنه.
نکته ای که جایی خونده بودم و خیلی هم ازش مطمئن نیستم این هست که اشاره کردن بودن ترتیب نوشتن فیلدها در Parcel و خوندن از Parcel در این دو متد باید یکسان باشه. یعنی اگه در متد writeToParcel اول فیلد id رو اضافه کردید، در متد DBOneRow هم اول فیلد id رو بخونید.
javaweb341
جمعه 09 مهر 1395, 15:51 عصر
نکته ای که جایی خونده بودم و خیلی هم ازش مطمئن نیستم این هست که اشاره کردن بودن ترتیب نوشتن فیلدها در Parcel و خوندن از Parcel در این دو متد باید یکسان باشه. یعنی اگه در متد writeToParcel اول فیلد id رو اضافه کردید، در متد DBOneRow هم اول فیلد id رو بخونید.
آره واقعا این جوری هستش و نکته ی خیلی مهمی است،
من الان چند روز به دلیل یک جابجایی در این بخش، دارم صد ها خط رو از نو می نویسم و مشکل حل نمیشد تا اتفاقی به پست شما رسیدم و با رعایت ترتیب این دو متد مشکل رفع شد
واقعا ممنون
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.