我发现大部分人在写序列化的时候,都是用的Serializable。很少使用Parceable,其实他们大多数都知道Parcelable这个东西,也知道在不本地化数据的时候,速度比Serializable快很多。但是因为写起来比较复杂,用者不习惯就放弃了。但是,我不支持这种观点和想法,所以今天我们就来简单介绍下Parceable这个怎么用。Parcelable的介绍前面一篇博客就有介绍了,不理解的可以先看看:http://blog.youkuaiyun.com/richardli1228/article/details/45273805
。下面我们用代码来实现Parcelable,随便写的:
1.首先写个简单的Student类
package com.richardli.parcelabledemo;
import android.os.Parcel;
import android.os.Parcelable;
public class Student implements Parcelable {
public int id;
public int age;
public String sex;
public int height;
public Student() {
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeInt(age);
dest.writeString(sex);
dest.writeInt(height);
}
private Student(Parcel source) {
id = source.readInt();
age = source.readInt();
sex = source.readString();
height = source.readInt();
}
public static final Creator<Student> CREATOR = new Creator<Student>() {
@Override
public Student[] newArray(int size) {
return new Student[size];
}
@Override
public Student createFromParcel(Parcel source) {
return new Student(source);
}
};
@Override
public String toString() {
return "Student [id=" + id + ", age=" + age + ", sex=" + sex
+ ", height=" + height + "]";
}
}
2.写一个Teacher类,里面实现了一个Student集合和一个Student类
package com.richardli.parcelabledemo;
import java.util.ArrayList;
import java.util.List;
import android.os.Parcel;
import android.os.Parcelable;
public class Teacher implements Parcelable {
public int id;
public int age;
public String sex;
public List<Student> studentList;
public Student student;
public Teacher() {
}
@Override
public int describeContents() {
return 0;
}
private Teacher(Parcel source) {
id = source.readInt();
age = source.readInt();
sex = source.readString();
// 读取list集合时,一定要先判断是否为Null.如果不判断,会出现null指针
if (studentList == null) {
studentList = new ArrayList<Student>();
}
source.readList(studentList, Student.class.getClassLoader());
student = source.readParcelable(Student.class.getClassLoader());
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeInt(age);
dest.writeString(sex);
dest.writeList(studentList);
dest.writeParcelable(student, flags);
}
public static final Creator<Teacher> CREATOR = new Creator<Teacher>() {
@Override
public Teacher[] newArray(int size) {
return new Teacher[size];
}
@Override
public Teacher createFromParcel(Parcel source) {
return new Teacher(source);
}
};
@Override
public String toString() {
return "Teacher [id=" + id + ", age=" + age + ", sex=" + sex
+ ", studentList=" + studentList + "]";
}
}
3.写一个要传递的People类,实现一个Teacher集合,和一个String[] 数组。
package com.richardli.parcelabledemo;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import android.os.Parcel;
import android.os.Parcelable;
public class People implements Parcelable {
public List<Teacher> teacherList;
public int id;
public String[] str;
public People() {
}
@Override
public int describeContents() {
return 0;
}
private People(Parcel source) {
if (teacherList == null) {
teacherList = new ArrayList<Teacher>();
}
source.readList(teacherList, Teacher.class.getClassLoader());
id = source.readInt();
// 读取数组的时候,先判断是否这个数组的长度
int length = source.readInt();
String[] str = null;
if (length > 0) {
str = new String[length];
source.readStringArray(str);
}
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeList(teacherList);
dest.writeInt(id);
// 写入数组的时候,记得判断数组是否为null和不为null 情况下的处理
if (str == null) {
dest.writeInt(0);
} else {
dest.writeInt(str.length);
}
if (str != null) {
dest.writeStringArray(str);
}
}
public static final Creator<People> CREATOR = new Creator<People>() {
@Override
public People[] newArray(int size) {
return new People[size];
}
@Override
public People createFromParcel(Parcel source) {
return new People(source);
}
};
@Override
public String toString() {
return "teacherList=" + teacherList + ", id=" + id + ", str="
+ Arrays.toString(str);
}
}
4.在构造一个要传递的数据
package com.richardli.parcelabledemo;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
private People mPeople;
private List<People> mPeopleList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setPeopleClass();
Button button = (Button) findViewById(R.id.testBtn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, TwoActivity.class);
//这里要传递的数据
intent.putExtra("people", mPeople);
intent.putParcelableArrayListExtra("peopleList",
(ArrayList<? extends Parcelable>) mPeopleList);
startActivity(intent);
}
});
}
// 构造一个测试People类
private void setPeopleClass() {
List<Teacher> teacherList = new ArrayList<Teacher>();
List<Student> studentList = new ArrayList<Student>();
for (int i = 0; i < 5; i++) {
Student student = new Student();
student.id = i;
student.age = (i + 1) * 5;
student.sex = "男" + i;
student.height = (i + 1) * 40;
studentList.add(student);
}
Student student = new Student();
student.id = 101;
student.age = 28;
student.sex = "男";
student.height = 178;
for (int i = 0; i < 2; i++) {
Teacher teacher = new Teacher();
teacher.id = i;
teacher.age = i;
teacher.sex = "女" + i;
teacher.studentList = studentList;
teacher.student = student;
teacherList.add(teacher);
}
String[] strTest = new String[] { "睡觉啦", "测试啦", "产品不用改啦", "改得太多" };
mPeople = new People();
mPeople.id = 1;
mPeople.teacherList = teacherList;
mPeople.str = strTest;
mPeopleList = new ArrayList<People>();
for (int i = 0; i < 3; i++) {
mPeopleList.add(mPeople);
}
}
}
5.在TwoActivity中接收传递的数据
package com.richardli.parcelabledemo;
import java.util.List;
import android.R.integer;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
public class TwoActivity extends Activity {
private People mPeople;
private List<People> mPeopleList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_two);
mPeople = getIntent().getExtras().getParcelable("people");
mPeopleList = getIntent().getExtras().getParcelableArrayList(
"peopleList");
Log.i("TAG", "---------这里是people----------");
Log.i("TAG", mPeople.toString());
Log.i("TAG", "---------这里是peopleList--------");
Log.i("TAG", mPeople.toString());
}
}
这样就传递完了数据。如果是传递一些复杂的数据,可以在上面做一些简单的处理。但是万变不离本宗...