很久沒有寫瞭,一直不知道寫什麼,最近在研究怎樣在Android的開發中傳遞一些復雜的數據。其實網上已經有很多的人都寫過相關的,但是看瞭後,發現都大同小異,缺少我想要看到的地方。所以我打算做一下這方面的探討。
有時候在團隊開發的時候,我們會考慮創建一些復雜(包含的數據類型有多種)的Model,方便在數據上的傳輸和處理。一些關於android中對於這類model的傳遞,一般都是實現Parcelable或者是Serializable這兩個接口,這兩個接口有一些不同,Serializable接口一般隻做一些簡單的數據類型傳遞,而Parcelable可以實現很多復雜的情況,比如Parcelable中嵌套瞭圖片,實現瞭Parcelable的其他模型等,而對於這種復雜的類型,網上很難找到這樣的內容,所以我做瞭一個例子來解決。
首先,我創建瞭三個數據model:ArtistMode,TrackModel和AlbumModel,根據名字大傢應該能夠明白。這三個類中隻有ArtistModel是實現的Serializable接口,另外兩個都是實現的Parcelable接口。
ArtistModel:歌手信息,包含瞭歌手的名字,年齡,性別和國籍,這些都是簡單的String和int型數據;
TrackMode:歌曲信息,包含歌曲的名字,發行時間和歌手列表(這裡采用瞭一個存放ArtistMode的List);
AlbumModel:專輯信息,包含瞭專輯的名字,歌手信息(ArtistMode),發行時間和歌曲列表(一個存放TrackModel的List)。
介紹完瞭三個模型後,我們就要具體實現模型中數據的讀寫瞭。對於Parcelable或者是Serializable該復寫哪些方法我也就不多說,網上對於這個介紹的都很多。現在是說說一個需要註意的地方。
Java代碼
@Override
public void writeToParcel(Parcel dest, int flag) {
dest.writeString(albumName);
dest.writeSerializable(artistModel);
dest.writeList(trackList);
dest.writeString(releaseTime);
}
public static final Parcelable.Creator<AlbumModel> CREATOR = new Parcelable.Creator<AlbumModel>() {
@Override
public AlbumModel createFromParcel(Parcel source) {
AlbumModel model = new AlbumModel();
model.albumName = source.readString();
model.artistModel = (ArtistModel) source.readSerializable();
// 必須實例化
model.trackList = new ArrayList<TrackModel>();
source.readList(model.trackList, getClass().getClassLoader());
model.releaseTime = source.readString();
return model;
}
@Override
public AlbumModel[] newArray(int size) {
return new AlbumModel[size];
}
};
註意上面在writeToParcel()方法中我用瞭一個dest.writeList(trackList);來傳遞一個List。相對應的讀取裡面,有這段代碼:
Java代碼
// 必須實例化
model.trackList = new ArrayList<TrackModel>();
source.readList(model.trackList, getClass().getClassLoader());
這裡要想讀出存放進去的List,就必須先將List實例化,否則就讀不出來數據。這是我在查看Android的源碼後發型的,對於數據的讀寫,系統提供瞭一個比較全的讀取方法是readValue,這個方法中,系統會自動進行數據匹配的,但是具體的使用,大傢可以去嘗試,隻要明白讀寫的方式後,就不難實現瞭。
上面是一個唯一需要特別註意的地方。其餘的數據類型該怎麼傳遞,大傢可以嘗試,接下來我會把整個項目上傳,大傢有什麼問題可以留言。