`
nyxd
  • 浏览: 9483 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Android 开发中 Parcel存储类型和数据容器

阅读更多


android中使用Parcel(存储基本数据类型和引用数据类型的容器)通过IBinder来绑定,这种方法的作用是让数据在进程间传递数据,Parcel定位就是轻量级的高效的对象序列化和反序列化机制。

Framework中有parcel类,源码路径是:

Frameworks/base/core/java/android/os/Parcel.java

典型的源码片断如下:

/

Write an integer value into the parcel at the current dataPosition(), 

growing dataCapacity() if needed.

public final native void writeInt(int val); 

/

Write a long integer value into the parcel at the current dataPosition(), 

growing dataCapacity() if needed. 

public final native void writeLong(long val); 

他的方法如下:

Parcel parcel = Parcel.obtain();// 

获取一个Parcel 对象下面就可以对其进行方法进行操作了,

createXXX(),wirteXXX(),readXXX(),

其中dataPosition(),返回当前Parcel当前对象存储数据的偏移量,而setDataPosition(),设置当前Parcel对象的偏移量,方便读取parcel中的数据,可问题就出在我读取出来的数据要么是空(null,要么永远是第一个偏移量处的值。Parcel采用什么机制实现的,是以什么形式的存储的,然后我才能任意对其操作。

基本数据类型的取值范围,boolean 1bitshort 16bitint 32bitlong 64bitfloat 32bitdouble 64bitchar 16bitbyte 8bit

由此我可以猜想,Parcel 32bit 作为基本单位存储写入的变量,4byte*8=32bit,在内存中的引用地址变量是采用16进制进行编码,且作为偏移量,即偏移量是4的倍数,0,4,8,12,16,20,24,28,32,36,40,44,48……4*N,f(x) = 4*yy>=0&y是自然数}

我想绝对不会出现向偏移量是369这样的数据。。。由此我们可以推断出,无论他存储的是基本数据类型或引用数据类型的变量,都是以32bit基本单位作为偏移量。

parcel.writeInt(1);parcel.writeInt(2);parcel.writeInt(3);parcel.writeInt(4);parcel.writeInt(5);parcel.writeInt(6);parcel.writeInt(7);parcel.writeInt(81011111);parcel.writeFloat(1f);parcel.writeFloat(1000000000000000000000000000000000000f);parcel.writeXXX(),每写一次数据,在32bit的空间里能够存储要放入的变量,怎只占一个偏移量,也就之一动4个位置。

而当存储的数据如:parcel.writeFloat(1000000000000000000000000000000000000f);他就自动往后移动,

parcel.writeString(“a”);parcel.writeString(“b”);parcel.writeString(“d”);parcel.writeString(“c”);parcel.writeString(“abcd”); 的区别。

有此可见,他的内存的分配原来是这样的。那我怎样才能把我存进去的数据依次的去出来呢?setDataPosition(),设置parcel的偏移量,在readXXX(),读取数据

int size = parcel.dataSize();

int i = 0;

while (i <= size ) 

{

parcel.setDataPosition(i);

int curr_int = parcel.readInt();

i+=4;

int j = 0;

j++;

}

由此可见parcel写入数据是按照32bit 为基本的容器,依次存储写入的数据,基本和引用(其实引用的也是有多个基本数据类型组合而成OBJECTS-属性|方法),读取的时候我们就可以按照这种规律根据目标数据的偏移量的位置(curr_position),以及偏移量的大小(size),取出已经存进去的数据了。

int i = curr_position

while (i <= size )

{

parcel.setDataPosition(i);

int curr_int = parcel.readXXXt();

i+=4;

int j = 0;

j++;

}

最后提醒一句java中基本数据类型的取值范围,引用类型的数据,相当于c中的指针,以及各进制之间的相互转换和灵活的引用,以及定制自己想要的任意进制数据类型。译成串行化、序列化……,其作用是能将数据对象存入字节流当中,在需要时重新生成对象。主要应用是利用外部存储设备保存对象状态,以及通过网络传输对象等。 

分享到:
评论

相关推荐

    Android中Parcel用法详解

    Android 中Parcel 的使用,他是一个存储基本数据类型和引用数据类型的容器,在andorid 中通过IBinder来绑定数据在进程间传递数据。 Parcel parcel = Parcel.obtain();// 获取一个Parcel 对象 下面就可以对其进行...

    用于在状态保存和恢复期间避免TransactionTooLargeException的Android库_Java_Kot.zip

    在Android开发中,状态保存和恢复是常见的需求,特别是在应对屏幕旋转、系统配置更改或应用被系统杀掉后重新启动等情况。然而,在处理这些场景时,开发者可能会遇到一个棘手的问题——`TransactionTooLargeException...

    Activity之间传递对象的Demo

    在Android应用开发中,Activity是构成应用程序的基本单元,它们之间的通信是实现功能交互的重要环节。当我们需要在不同的Activity之间传递数据时,特别是涉及到对象实例的传递,就需要掌握特定的技巧。本篇将深入...

    android intent源码学习

    5. Bundle与Extras:Intent中的Extras通常使用Bundle来存储,它是一个可扩展的键值对容器,可以容纳各种类型的对象。Intent.getExtras()和putExtras(Bundle extras)是常用的API,用于获取和设置Intent中的附加数据。...

    Android应用源码之Bundle.zip

    在Android应用开发中,`Bundle`是一个至关重要的概念,它是一个可以存储各种数据类型的容器,如基本类型、数组、集合、Parcelable对象等。`Bundle`主要用于在Activity之间传递数据,或者在Fragment之间传递数据,...

    Activity之间传递List数据

    在Android应用开发中,Activity是应用程序的基本组件,用于展示用户界面和处理用户交互。当需要在不同的Activity之间传递数据时,通常会用到Intent对象。然而,标准的Intent API并不直接支持传递大型数据集合,如...

    BundleObject

    `Bundle`是Android系统中用于传递数据的容器类,它允许开发者在不同的组件之间(如Activity、Service、BroadcastReceiver)传递各种类型的数据。在这里,我们将深入探讨`BundleObject`的原理、使用方法以及在Android...

    android安卓笔记

    在Android开发中,经常用于临时存储或传递数据。 #### layout—布局 - **LinearLayout**:`LinearLayout`是最基本的布局容器之一,它可以将子视图按照垂直或水平方向排列。 - **TableLayout**:`TableLayout`用于...

    Android 70道面试题

    6. **Intent数据传递**:Intent可以传递多种数据类型,包括Serializable(序列化)、CharSequence(字符序列)、Parcelable(可 parcel 化的对象)以及Bundle(可以用来存储键值对的数据容器)。所以选项abcd都是...

    Android面试题大全+答案[归类].pdf

    Intent可以传递多种类型的数据,包括Serializable(序列化对象)、CharSequence(字符序列)、Parcelable(可 parcel 化对象)和Bundle(可以存储各种类型数据的容器)。所以,选项A、B、C、D都是正确的。 7. ...

    activity传值

    在Android应用开发中,Activity是应用程序的基本组件,用于展示用户界面和处理用户交互。Activity之间的数据传递是一项常见的任务,尤其对于初学者来说,理解和掌握这一技能至关重要。本篇将深入探讨如何在Android的...

    Android Parcelable接口使用方法详解

    writeToParcel方法是写入接口函数,用于将对象序列化为一个Parcel对象,即将类的数据写入外部提供的Parcel中,打包需要传递的数据到Parcel容器保存,以便从Parcel容器获取数据。CREATOR是静态内部对象,实现...

    Android 不同Activity间数据的传递 Bundle对象的应用

    在Android开发中,Activity之间的数据传递是常见的需求。Bundle对象作为一个轻量级的数据容器,被广泛用于Intent中,以便在启动或切换Activity时传递数据。本文将详细讲解如何使用Bundle来实现不同Activity间的数据...

    SwitchingScreens:教程 - 在 2 个活动之间发送数据

    在Android应用开发中,活动(Activity)是用户界面的基本单元,它们之间经常需要进行数据交换。本教程将详细讲解如何在两个活动之间有效地传递数据,主要以Java编程语言为基础。 一、Intent:数据传递的桥梁 在...

Global site tag (gtag.js) - Google Analytics