Android中傳遞物件的三種方法
阿新 • • 發佈:2019-01-20
編輯推薦:稀土掘金,這是一個針對技術開發者的一個應用,你可以在掘金上獲取最新最優質的技術乾貨,不僅僅是Android知識、前端、後端以至於產品和設計都有涉獵,想成為全棧工程師的朋友不要錯過!
Android中,Activity和Fragment之間傳遞物件,可以通過將物件序列化並存入Bundle或者Intent中進行傳遞,也可以將物件轉化為JSON字串,進行傳遞。
序列化物件可以使用Java的Serializable
的介面、Parcelable
介面。轉化成JSON字串,可以使用Gson
等庫。
1.Serializable
Model
- publicclass Author implements Serializable{
- privateint id;
- private String name;
- //...
- }
- publicclass Book implements Serializable{
- private String title;
- private Author author;
- //...
- }
傳遞資料
- Book book=new Book();
- book.setTitle("Java程式設計思想");
- Author author=new Author();
- author.setId(1);
- author.setName("Bruce Eckel"
- book.setAuthor(author);
- Intent intent=new Intent(this,SecondActivity.class);
- intent.putExtra("book",book);
- startActivity(intent);
接收資料
- Book book= (Book) getIntent().getSerializableExtra("book");
- Log.d(TAG,"book title->"+book.getTitle());
- Log.d(TAG,"book author name->"+book.getAuthor().getName());
2.轉化為JSON字串
Model
- publicclass Author{
- privateint id;
- private String name;
- //...
- }
- publicclass Book{
- private String title;
- private Author author;
- //...
- }
傳遞資料
- Book book=new Book();
- book.setTitle("Java程式設計思想");
- Author author=new Author();
- author.setId(1);
- author.setName("Bruce Eckel");
- book.setAuthor(author);
- Intent intent=new Intent(this,SecondActivity.class);
- intent.putExtra("book",new Gson().toJson(book));
- startActivity(intent);
接收資料
- String bookJson=getIntent().getStringExtra("book");
- Book book=new Gson().fromJson(bookJson,Book.class);
- Log.d(TAG,"book title->"+book.getTitle());
- Log.d(TAG,"book author name->"+book.getAuthor().getName());
3.使用Parcelable
實現Parcelable
介面需要實現兩個方法
describeContents方法。內容介面描述,預設返回0就可以;
writeToParcel方法。將傳遞的資料打包到Parcel容器中。
除了要實現這兩個方法還必須建立一個Parcelable.Creator
介面的例項,用於讀取Parcel容器中的資料
Model
- publicclass Author implements Parcelable{
- privateint id;
- private String name;
- //setter & getter...
- @Override
- publicint describeContents() {
- return 0;
- }
- @Override
- publicvoid writeToParcel(Parcel dest, int flags) {
- //該方法將類的資料寫入外部提供的Parcel中.即打包需要傳遞的資料到Parcel容器儲存,
- // 以便從parcel容器獲取資料
- dest.writeString(name);
- dest.writeInt(id);
- }
- publicstaticfinal Creator<Author> CREATOR=new Creator<Author>() {
- @Override
- public Author createFromParcel(Parcel source) {
- //從Parcel容器中讀取傳遞資料值,封裝成Parcelable物件返回邏輯層。
- Author author=new Author();
- author.setName(source.readString());
- author.setId(source.readInt());
- return author;
- }
- @Override
- public Author[] newArray(int size) {
- //建立一個型別為T,長度為size的陣列,僅一句話(return new T[size])即可。方法是供外部類反序列化本類陣列使用。
- returnnew Author[size];
- }
- };
- }
- publicclass Book implements Parcelable{
- private String title;
- private Author author;
- //setter & getter...
- @Override
- publicint describeContents() {
- return 0;
- }
- @Override
- publicvoid writeToParcel(Parcel dest, int flags) {
- dest.writeString(title);
- dest.writeParcelable(author,flags);
- }
- publicstaticfinal Creator<Book> CREATOR=new Creator<Book>() {
- @Override
- public Book createFromParcel(Parcel source) {
- Book book=new Book();
- book.setTitle(source.readString());
- book.setAuthor(source.<Author>readParcelable(Author.class.getClassLoader()));
- return book;