【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android中如何使用Parcelable接口_第1頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android中如何使用Parcelable接口_第2頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android中如何使用Parcelable接口_第3頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android中如何使用Parcelable接口_第4頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android中如何使用Parcelable接口_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android中如何使用Parcelable接口

Android中如何使用Parcelable接口,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面在下將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

AndroidParcelable接口使用方法詳解1.Parcelable接口InterfaceforclasseswhoseinstancescanbewrittentoandrestoredfromaParcel。ClassesimplementingtheParcelableinterfacemustalsohaveastaticfieldcalledCREATOR,whichisanobjectimplementingtheParcelable.Creatorinterface。2.實(shí)現(xiàn)Parcelable就是為了進(jìn)行序列化,那么,為什么要序列化?1)永久性保存對(duì)象,保存對(duì)象的字節(jié)序列到本地文件中;2)通過(guò)序列化對(duì)象在網(wǎng)絡(luò)中傳遞對(duì)象;3)通過(guò)序列化在進(jìn)程間傳遞對(duì)象。3.實(shí)現(xiàn)序列化的方法Android中實(shí)現(xiàn)序列化有兩個(gè)選擇:一是實(shí)現(xiàn)Serializable接口(是JavaSE本身就支持的),一是實(shí)現(xiàn)Parcelable接口(是android特有功能,效率比實(shí)現(xiàn)Serializable接口高效,可用于Intent數(shù)據(jù)傳遞,也可以用于進(jìn)程間通信(IPC))。實(shí)現(xiàn)Serializable接口非常簡(jiǎn)單,聲明一下就可以了,而實(shí)現(xiàn)Parcelable接口稍微復(fù)雜一些,但效率更高,推薦用這種方法提高性能。注:Android中Intent傳遞對(duì)象有兩種方法:一是Bundle.putSerializable(Key,Object),另一種是Bundle.putParcelable(Key,Object)。當(dāng)然這些Object是有一定的條件的,前者是實(shí)現(xiàn)了Serializable接口,而后者是實(shí)現(xiàn)了Parcelable接口。4.選擇序列化方法的原則1)在使用內(nèi)存的時(shí)候,Parcelable比Serializable性能高,所以推薦使用Parcelable。2)Serializable在序列化的時(shí)候會(huì)產(chǎn)生大量的臨時(shí)變量,從而引起頻繁的GC。3)Parcelable不能使用在要將數(shù)據(jù)存儲(chǔ)在磁盤(pán)上的情況,因?yàn)镻arcelable不能很好的保證數(shù)據(jù)的持續(xù)性在外界有變化的情況下。盡管Serializable效率低點(diǎn),但此時(shí)還是建議使用Serializable。5.應(yīng)用場(chǎng)景需要在多個(gè)部件(Activity或Service)之間通過(guò)Intent傳遞一些數(shù)據(jù),簡(jiǎn)單類型(如:數(shù)字、字符串)的可以直接放入Intent。復(fù)雜類型必須實(shí)現(xiàn)Parcelable接口。6、Parcelable接口定義public

interface

Parcelable

{

//內(nèi)容描述接口,基本不用管

public

int

describeContents();

//寫(xiě)入接口函數(shù),打包

public

void

writeToParcel(Parcel

dest,

int

flags);

//讀取接口,目的是要從Parcel中構(gòu)造一個(gè)實(shí)現(xiàn)了Parcelable的類的實(shí)例處理。因?yàn)閷?shí)現(xiàn)類在這里還是不可知的,所以需要用到模板的方式,繼承類名通過(guò)模板參數(shù)傳入

//為了能夠?qū)崿F(xiàn)模板參數(shù)的傳入,這里定義Creator嵌入接口,內(nèi)含兩個(gè)接口函數(shù)分別返回單個(gè)和多個(gè)繼承類實(shí)例

public

interface

Creator<T>

{

public

T

createFromParcel(Parcel

source);

public

T[]

newArray(int

size);

}

}7、實(shí)現(xiàn)Parcelable步驟1)implementsParcelable2)重寫(xiě)writeToParcel方法,將你的對(duì)象序列化為一個(gè)Parcel對(duì)象,即:將類的數(shù)據(jù)寫(xiě)入外部提供的Parcel中,打包需要傳遞的數(shù)據(jù)到Parcel容器保存,以便從Parcel容器獲取數(shù)據(jù)3)重寫(xiě)describeContents方法,內(nèi)容接口描述,默認(rèn)返回0就可以4)實(shí)例化靜態(tài)內(nèi)部對(duì)象CREATOR實(shí)現(xiàn)接口Parcelable.Creatorpublic

static

final

Parcelable.Creator<T>

CREATOR注:其中publicstaticfinal一個(gè)都不能少,內(nèi)部對(duì)象CREATOR的名稱也不能改變,必須全部大寫(xiě)。需重寫(xiě)本接口中的兩個(gè)方法:createFromParcel(Parcelin)實(shí)現(xiàn)從Parcel容器中讀取傳遞數(shù)據(jù)值,封裝成Parcelable對(duì)象返回邏輯層,newArray(intsize)創(chuàng)建一個(gè)類型為T(mén),長(zhǎng)度為size的數(shù)組,僅一句話即可(returnnewT[size]),供外部類反序列化本類數(shù)組使用。簡(jiǎn)而言之:通過(guò)writeToParcel將你的對(duì)象映射成Parcel對(duì)象,再通過(guò)createFromParcel將Parcel對(duì)象映射成你的對(duì)象。也可以將Parcel看成是一個(gè)流,通過(guò)writeToParcel把對(duì)象寫(xiě)到流里面,在通過(guò)createFromParcel從流里讀取對(duì)象,只不過(guò)這個(gè)過(guò)程需要你來(lái)實(shí)現(xiàn),因此寫(xiě)的順序和讀的順序必須一致。代碼如下: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();

}

}8、Serializable實(shí)現(xiàn)與Parcelabel實(shí)現(xiàn)的區(qū)別1)Serializable的實(shí)現(xiàn),只需要implements

Serializable即可。這只是給對(duì)象打了一個(gè)標(biāo)記,系統(tǒng)會(huì)自動(dòng)將其序列化。2)Parcelabel的實(shí)現(xiàn),不僅需要implements

Parcelabel,還需要在類中添加一個(gè)靜態(tài)成員變量CREATOR,這個(gè)變量需要實(shí)現(xiàn)Parcelable.Creator接口。兩者代碼比較:1)創(chuàng)建Person類,實(shí)現(xiàn)Serializablepublic

class

Person

implements

Serializable

{

private

static

final

long

serialVersionUID

=

-7060210544600464481L;

private

String

name;

private

int

age;

public

String

getName()

{

return

name;

}

public

void

setName(String

name)

{

=

name;

}

public

int

getAge()

{

return

age;

}

public

void

setAge(int

age)

{

this.age

=

age;

}

}2)創(chuàng)建Book類,實(shí)現(xiàn)Parcelablepublic

class

Book

implements

Parcelable

{

private

String

bookName;

private

String

author;

private

int

publishDate;

public

Book()

{

}

public

String

getBookName()

{

return

bookName;

}

public

void

setBookName(String

bookName)

{

this.bookName

=

bookName;

}

public

String

getAuthor()

{

return

author;

}

public

void

setAuthor(String

author)

{

this.author

=

author;

}

public

int

getPublishDate()

{

return

publishDate;

}

public

void

setPublishDate(int

publishDate)

{

this.publishDate

=

publishDate;

}

@Override

public

int

describeContents()

{

return

0;

}

@Override

public

void

writeToParcel(Parcel

out,

int

flags)

{

out.writeString(bookName);

out.writeString(author);

out.writeInt(publishDate);

}

public

static

final

Parcelable.Creator<Book>

CREATOR

=

new

Creator<Book>()

{

@Override

public

Book[]

newArray(int

size)

{

return

new

Book[size];

}

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論