Android中Parcelable的使用

轉載請標明出處 :http://www.javashuo.com/article/p-tueswqxj-hg.html html

Parcelable與Serializableandroid

Serializable是Java爲咱們提供的一個標準化的序列化接口。網絡

Parcelable是Android爲咱們提供的序列化的接口。ide

 


 

對比:this

一、Parcelable相對於Serializable的使用相對複雜一些。spa

二、Parcelable的效率相對Serializable也高不少。code

三、Parcelable不能使用在要將數據存儲在磁盤上的狀況,由於Parcelable在外界有變化的狀況下不能很好的保證數據的持續性。儘管Serializable效率低點,但此時仍是建議使用Serializable。存儲到設備或者網絡傳輸上選擇Serializable。htm

 


 

序列化與反序列化對象

序列化:將對象轉換爲能夠傳輸的二進制流(二進制序列)的過程,這樣咱們就能夠經過序列化,轉化爲能夠在網絡傳輸或者保存到本地的流(序列),從而進行傳輸數據 。blog

反序列化:從二進制流(序列)轉化爲對象的過程。

 

簡單使用:

進行Android開發的時候,沒法將對象的引用傳給Activities或者Fragments,咱們須要將這些對象放到一個Intent或者Bundle裏面,而後再傳遞。簡單看一下:

一、定義Book類,實現Parcelable接口。

 

package com.status.mattest;

import android.os.Parcel;
import android.os.Parcelable;

public class Book implements Parcelable {

    private String name;
    private int id;
    private String classify;

    protected Book(Parcel in) {
        name = in.readString();
        classify = in.readString();
        id = in.readInt();
    }

    public Book(String classify, String name, int id) {
        this.name = name;
        this.id = id;
        this.classify = classify;
    }

    /**
     * 反序列化
     */
    public static final Creator<Book> CREATOR = new Creator<Book>() {
        @Override
        public Book createFromParcel(Parcel in) {
            return new Book(in);
        }

        @Override
        public Book[] newArray(int size) {
            return new Book[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    /**
     * 序列化過程
     *
     * @param dest
     * @param flags
     */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeString(classify);
        dest.writeInt(id);
    }


    @Override
    public String toString() {
        return "name : " +
                name + "\"" + "id : " + id + "\"" + "classify" + classify;
    }
}

writeToParcel:序列化過程

Creator與protected Book(Parcel in)配合實現反序列化,轉換爲對象。

 

注意:類中有多個String或者其它相同對象的話,那麼writeToParcel中writeString的順序是怎麼樣的,protected Book(Parcel in) {}中readString的順序就得是怎麼樣的。

 

二、mainActivity中:

textView.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
          Intent intent = new Intent(MainActivity.this, Test1Activity.class);
          intent.putExtra("key", new Book("哈", "鴻", 8));
          startActivity(intent);
      }
  });

 

三、另外一個Activity獲取:

 Intent intent = getIntent();
 Book book = intent.getParcelableExtra("key");
 Log.d("Test1Activity", book.toString());

 

輸出:

 


 

Book類裏面有其它對象:

若是Book類裏面有其餘對象(好比實體類Data)的話,那麼Data也須要實現Parcelable接口,用法與上面的Book類同樣。

writeToParcel裏面須要寫上:dest.writeParcelable(data, 0);

protected Book(Parcel in) {}裏面須要寫上data = in.readParcelable(Data.class.getClassLoader());

 


 參考:https://www.jianshu.com/p/df35baa91541

相關文章
相關標籤/搜索