有時我們在兩個Activity之間傳遞數據時,傳遞的數據過多時,這時我門會考慮到傳遞一個對象過去,來解決這個問題,有兩個接口Serializable和Parcelable可以實現對象的傳遞;既然有兩個,那肯定是有區別的?
Serializable接口:Serializable 接口是一種標識接口(marker interface),這意味着無需實現方法,Java便會對這個對象進行高效的序列化操作,但是在內存中開銷方面會比較大,效率會過慢。
Parcelable接口:Android的Parcelable的設計初衷是因爲Serializable效率過慢,在內存開銷方面較小,爲了在程序內不同組件間以及不同Android程序間(AIDL)高效的傳輸數據而設計,這些數據僅在內存中存在,Parcelable是通過IBinder通信的消息的載體。
爲了提高程序的性能和效率,google官方推薦大家使用Parcelable接口;接下來看看怎麼使用它們吧?
Serializable接口:類只需要實現Serializable接口
import java.io.Serializable;
public class Teacher implements Serializable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
啓動Activity時,使用 intent.putExtra()方法將對象傳遞過去。
Teacher teacher=new Teacher();
Intent intent=new Intent(MainActivity.this,Main2Activity.class);
teacher.setName("張丹");
teacher.setAge(32);
intent.putExtra("teacher",teacher);
startActivity(intent);
Main2Activity:
Intent intent = getIntent();
Teacher teacher = (Teacher) intent.getSerializableExtra("teacher");
Toast.makeText(this, teacher.toString(), Toast.LENGTH_SHORT).show();
Parcelable接口:parcelable需要實現writeToParcel、describeContents函數以及靜態的CREATOR變量,實際上就是將如何打包和解包的工作自己來定義,而序列化的這些操作完全由底層實現。
import android.os.Parcel;
import android.os.Parcelable;
public class Student implements Parcelable {
private String name;
private int age;
public Student() {
}
//解包,讀取數據
protected Student(Parcel in) {
name = in.readString();
age = in.readInt();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int describeContents() {
return 0;
}
//將數據打包
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
//對象的創建器,將數據解包
public static final Creator<Student> CREATOR = new Creator<Student>() {
@Override
public Student createFromParcel(Parcel in) {
return new Student(in);
}
@Override
public Student[] newArray(int size) {
return new Student[size];
}
};
}
啓動Activity時,使用 intent.putExtra()方法將對象傳遞過去
Student student=new Student();
Intent intent=new Intent(MainActivity.this,Main3Activity.class);
student.setName("李思思");
student.setAge(18);
intent.putExtra("student",student);
startActivity(intent);
Main3Activity
Intent intent = getIntent();
Student student = intent.getParcelableExtra("student");
Toast.makeText(this, student.toString(), Toast.LENGTH_SHORT).show();
以上是Serializable和Parcelable的區別和用法,小編的水平有限,如果大家有什麼疑問,大家一起討論,可以加我的qq 1059408192;
轉載請註明出處;