Android:復雜數據模型的傳遞 – Android移動開發技術文章_手機開發 Android移動開發教學課程

 

很久沒有寫瞭,一直不知道寫什麼,最近在研究怎樣在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,這個方法中,系統會自動進行數據匹配的,但是具體的使用,大傢可以去嘗試,隻要明白讀寫的方式後,就不難實現瞭。

 

       上面是一個唯一需要特別註意的地方。其餘的數據類型該怎麼傳遞,大傢可以嘗試,接下來我會把整個項目上傳,大傢有什麼問題可以留言。

You May Also Like