Android中Parcelable的使用


轉載請標明出處 :https://www.cnblogs.com/tangZH/p/10998065.html 

更多精彩文章:http://77blogs.com/?p=286

Parcelable與Serializable

Serializable是Java為我們提供的一個標准化的序列化接口。

Parcelable是Android為我們提供的序列化的接口。

 


 

對比:

1、Parcelable相對於Serializable的使用相對復雜一些。

2、Parcelable的效率相對Serializable也高很多。

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

 


 

序列化與反序列化

序列化:將對象轉換為可以傳輸的二進制流(二進制序列)的過程,這樣我們就可以通過序列化,轉化為可以在網絡傳輸或者保存到本地的流(序列),從而進行傳輸數據 。

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

 

簡單使用:

進行Android開發的時候,無法將對象的引用傳給Activities或者Fragments,我們需要將這些對象放到一個Intent或者Bundle里面,然后再傳遞。簡單看一下:

1、定義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的順序就得是怎么樣的。

 

2、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);
      }
  });

 

3、另一個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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM