Android Parceable的简单用法,如何传递List<T>和对象,中间写入数组

本文探讨了Android中较少使用的Parcelable序列化方式,指出其在非持久化数据传输时速度优于Serializable。虽然因为编码复杂度较高,开发者往往选择后者,但作者不建议完全放弃Parcelable。通过实例代码,展示了如何实现Parcelable,包括创建一个简单的Student类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    我发现大部分人在写序列化的时候,都是用的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());
	}

}
这样就传递完了数据。如果是传递一些复杂的数据,可以在上面做一些简单的处理。但是万变不离本宗...


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值