Android Parceable传递复杂类型数据

Android Parcelable传递复杂类型数据
 
          有些时候需要在activity之间或通过handler message 传递复杂数据类型得出数据,这时候往往会比较麻烦,通过实现Parcelable接口将复杂数据封装起来,

           一、利用工具类,即新建类实现Parcelable接口

              主要实现三个方法:
              1、describeContents()   直接返回0 就可以了
              2、writeToParcel(Parcel dest, int flags)    将外部数据写入到Parcel中(封装起来)但是要注意在其他地方读取数据的顺序应该与这儿写入的顺序一致,否则会数据混乱。
              3、静态的Parcelable.Creator<>  CREATOR 接口 注意必须是 CREATOR  前边修饰关键字只能是 public static (可以有 final),这个接口是用来反序列化的,其中有两个方法,第二个比较简单直接返回相应类型的数组就可以了,大小就是参数 size , 第一个就是讲Parcel中的数据重新写入到相应的对象中,注意写的顺序。详情见以下代码:
@Override
	public int describeContents() {
		return 0;
	}

	/*
	 * 对象序列化在这里实现,
	 * 对每一个属性进行封装,写到流中
	 * 注意:在其他地方读或者设置值的时候,要跟这里写的顺序保持一致,否则读到的值可能为null
	 * */
	@Override
	public void writeToParcel(Parcel dest, int flags) {
		dest.writeInt(user.getId());
		dest.writeString(user.getName());
		dest.writeString(user.getGender());
		dest.writeParcelable(user.getBitmap(), PARCELABLE_WRITE_RETURN_VALUE);
	}

	/** 反序列化 
	* 注意 CREATOR 必须有 并且 必须是这个名 也必须是 public static (可以再有 final 修饰)否则会报异常 badparceableexception
	*/
	public static  Parcelable.Creator CREATOR = new Parcelable.Creator() {

		@Override
		public ParcelableUtil createFromParcel(Parcel source) {
			return new ParcelableUtil(source);
		}

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


           二、如果是传递对象类型,可以直接对象实体类实现Parcelable接口,其中代码跟上边类似,个人感觉更简单了。
          
           三、如何使用,直接见以下代码:
    //  传递数据
    Listlist = new ArrayList();
		Bitmap bitmap =  BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
				
		for (int i = 0; i < 5; i++) {
			User user =  new User(i, "萧 = "+i, "male = "+i);
			user.setBitmap(bitmap);
			list.add(user);
		   }
	@SuppressWarnings("rawtypes")
	ArrayList ll = new ArrayList ();  // 别考虑泛型的问题,就这样写 怕出异常直接try catch
	ll.add(list);
	User user =  new User(1, "萧", "male");
	user.setBitmap(bitmap);
//	ParcelableUtil util = new ParcelableUtil(user);         // 借用工具类  将对象parcelable序列化
	Bundle  bundle = new Bundle();
	bundle.putParcelable("user", user);                 //  直接传递
//  bundle.putParcelable("user" , util);    			// 传递工具类对象	
	bundle.putParcelableArrayList("list", ll);
				
	
	// 接收数据			
	Intent intent = getIntent();
	Bundle bundle =  intent.getBundleExtra("data");
	ArrayList arrayList  = bundle.getParcelableArrayList("list");
	List list = (List) arrayList.get(0);
	for (int i = 0; i < list.size(); i++) {
		System.out.println(list.get(i));
	}
//	ParcelableUtil util = bundle.getParcelable("user");
//	User user = util.getUser();
	User user = bundle.getParcelable("user");
          
项目下载地址: http://download.csdn.net/detail/ouyangjiluo/7106259

                   


 

你可能感兴趣的:(Android)