Android源码之ParcelWord下载.docx
- 文档编号:15956600
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:4
- 大小:17.41KB
Android源码之ParcelWord下载.docx
《Android源码之ParcelWord下载.docx》由会员分享,可在线阅读,更多相关《Android源码之ParcelWord下载.docx(4页珍藏版)》请在冰豆网上搜索。
POOL_SIZE;
i++){p=pool[i];
if(p!
=null){pool[i]=null;
if(DEBUG_RECYCLE){p.mStack=newRuntimeException();
}returnp;
}}}returnnewParcel(0);
}publicfinalvoidrecycle(){if(DEBUG_RECYCLE)mStack=null;
freeBuffer();
finalParcel[]pool=mOwnObject!
=0?
sOwnedPool:
sHolderPool;
synchronized(pool){for(inti=0;
i++){if(pool[i]==null){pool[i]=this;
return;
}}}}
获取接口obtain是从一个已分配的Parcel池中取得一个Parcel,即sOwnedPool,其定义如下:
[java]viewplaincopyprivatestaticfinalintPOOL_SIZE=6;
privatestaticfinalParcel[]sOwnedPool=newParcel[POOL_SIZE];
privatestaticfinalParcel[]sHolderPool=newParcel[POOL_SIZE];
当使用完获得的Parcel后,最好使用recycle将其释放回池,以便下次使用,否则导致Parcel池无可分配资源而new新对象。
幸运的是,eclipse会给出此类的警告提示。
二、Parcel内部指针的移动
[java]viewplaincopypublicfinalnativeintdataSize();
publicfinalnativeintdataAvail();
publicfinalnativeintdataPosition();
publicfinalnativeintdataCapacity();
publicfinalnativevoidsetDataSize(intsize);
publicfinalnativevoidsetDataPosition(intpos);
publicfinalnativevoidsetDataCapacity(intsize);
由于Parcel的读写是直接在内存中的,所以这几个接口就是指示当前的读写指针,类似于Linux下的文件读写操作:
dataSize:
返回当前内存块中总共的数据
dataPosition:
返回当前读操作指针
dataAvail:
返回当前可读的数据,即dataSize-dataPosition
dataCapacity:
返回当前内存块的容量(在不重新分配内存的前提下),dataCapacity-dataSize即为可写入的数据量三、数据读写类
1、序列化与反序列化
publicfinalnativebyte[]marshall();
publicfinalnativevoidunmarshall(byte[]data,intoffest,intlength);
作用类似于序列化和反序列化。
即将当前Parcel的数据序列化为byte数组,或者将byte数组反序列化到当前Parcel中。
注:
unmarshall后,如果要读取数据,首先需要将文件指针移动到初始化位置,即setDataPosition(0)。
2、基本数据类型的读写
privatenativevoidwriteNative(byte[]
b,intoffset,intlen);
publicfinalnativevoidwriteInt(intval);
publicfinalnativevoidwriteLong(longval);
publicfinalnativevoidwriteFloat(floatval);
publicfinalnativevoidwriteDouble(doubleval);
publicfinalnativevoidwriteString(Stringval);
publicfinalnativevoidwriteStrongBinder(IBinderval);
publicfinalnativevoidwriteFileDescriptor(FileDescriptorval);
publicfinalnativeintreadInt();
publicfinalnativelongreadLong();
publicfinalnativefloatreadFloat();
publicfinalnativedoublereadDouble();
publicfinalnativeStringreadString();
publicfinalnativeIBinderreadStrongBinder();
全部都是native方法,通过JNI来调用底层实现。
其余类型的读写都是在基本数据类型的基础上得来的。
如:
[java]viewplaincopypublicfinalvoidwriteByte(byteval){writeInt(val);
}publicfinalbytereadByte(){return(byte)(readInt()&
amp;
0xff);
}
可见,byte在Parcel中也占用四个字节。
3、Array类型的读写
Array类型的接口按类型来分,如boolean[]/char[]/int[]/float[]/double[]/String[],而每一种类型都包含三个接口:
publicfinalvoidwriteXXXArray(boolean[]val);
publicfinalboolean[]createXXXArray();
publicfinalvoidreadXXXArray(boolean[]val);
以boolean类型为例:
其源码如下:
[java]viewplaincopypublicfinalvoidwriteBooleanArray(boolean[]val){if(val!
=null){intN=val.length;
writeInt(N);
N;
i++){writeInt(val[i]?
1:
0);
}}else{writeInt(-1);
}}publicfinalboolean[]createBooleanArray(){intN=readInt();
//&
gt;
&
2asafastdivide-by-4worksinthecreate*Array()functions//becausedataAvail()willneverreturnanegativenumber.4is//thesizeofastoredbooleaninthestream.if(N&
=0&
N&
=(dataAvail()&
2)){boolean[]val=newboolean[N];
i++){val[i]=readInt()!
=0;
}returnval;
}else{returnnull;
}}publicfinalvoidreadBooleanArray(boolean[]val){intN=readInt();
if(N==val.length){for(inti=0;
}}else{thrownewRuntimeException("
badarraylengths"
);
}}
可见,其write操作的过程是先以整形的方式写入Array的长度,然后依次写入Array的每一个元素。
而读操作的过程则正好相反。
从以上示例看出,boolean类型在Parcel中也占据四个字节。
4、通用接口
[java]viewplaincopypublicfinalvoidwriteValue(Objectv){if(v==null){writeInt(VAL_NULL);
}elseif(vinstanceofString){writeInt(VAL_STRING);
writeString((String)v);
}elseif(vinstanceofInteger){writeInt(VAL_INTEGER);
writeInt((Integer)v);
}elseif(vinstanceofMap){writeInt(VAL_MAP);
writeMap((Map)v);
}elseif(vinstanceofBundle){//MustbebeforeParcelablewriteInt(VAL_BUNDLE);
writeBundle((Bundle)v);
}elseif(vinstanceofParcelable){writeInt(VAL_PARCELABLE);
writeParcelable((Parcelable)v,0);
}elseif(vinstanceofShort){writeInt(VAL_SHORT);
writeInt(((Short)v).intValue());
}elseif(vinstanceofLong){writeInt(VAL_LONG);
writeLong((Long)v);
}elseif(vinst
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 源码 Parcel