Android中Parcel用法詳解
本文實例講述了Android中Parcel用法。分享給大家供大家參考,具體如下:
Android 中Parcel 的使用,他是一個存儲基本數(shù)據(jù)類型和引用數(shù)據(jù)類型的容器,在andorid 中通過IBinder來綁定數(shù)據(jù)在進程間傳遞數(shù)據(jù)。
Parcel parcel = Parcel.obtain();// 獲取一個Parcel 對象
下面就可以對其進行方法進行操作了,createXXX(),wirteXXX(),readXXX(),
其中dataPosition(),返回當前Parcel 當前對象存儲數(shù)據(jù)的偏移量,而setDataPosition(),設置當前Parcel 對象的偏移量,方便讀取parcel 中的數(shù)據(jù),可問題就出在我讀取出來的數(shù)據(jù)要么是空(null),要么永遠是第一個偏移量處的值,存儲和讀取數(shù)據(jù)的。Parcel采用什么機制實現(xiàn)的,是以什么形式的存儲的,然后我才能任意對其操作,讀取目標數(shù)據(jù)。
基本數(shù)據(jù)類型的取值范圍:
boolean 1bit
short 16bit
int 32bit
long 64bit
float 32bit
double 64bit
char 16bit
byte 8bit
由此我可以猜想,Parcel 32bit 作為基本單位存儲寫入的變量,4byte*8=32bit,在內(nèi)存中的引用地址變量是采用16進制進行編碼,且作為偏移量,即偏移量是4的倍數(shù),0,4,8,12,16,20,24,28,32,36,40,44,48......4*N,
f(x) = 4*y{y>=0&y是自然數(shù)}
我想絕對不會出現(xiàn)向偏移量是3,6,9這樣的數(shù)據(jù)。。。
由此我們可以推斷出,無論他存儲的是基本數(shù)據(jù)類型或引用數(shù)據(jù)類型的變量,都是以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(),每寫一次數(shù)據(jù),在32bit的空間里能夠存儲要放入的變量,怎只占一個偏移量,也就之一動4個位置,而當存儲的數(shù)據(jù)如 parcel.writeFloat(1000000000000000000000000000000000000f);他就自動往后移動,
parcel.writeString("a");
parcel.writeString("b");
parcel.writeString("d");
parcel.writeString("c");
和
parcel.writeString("abcd");
的區(qū)別。由此可見,他的內(nèi)存的分配原來是這樣的。
那我怎樣才能把我存進去的書據(jù)依次的去出來呢?setDataPosition(),設置parcel 的偏移量,在readXXX(),讀取數(shù)據(jù)
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 寫入數(shù)據(jù)是按照32bit 為基本的容器,依次存儲寫入的數(shù)據(jù),基本和引用(其實引用的也是有多個基本數(shù)據(jù)類型組合而成OBJECTS-屬性|方法),讀取的時候我們就可以按照這種規(guī)律根據(jù)目標數(shù)據(jù)的偏移量的位置(curr_position),以及偏移量的大小(size),,取出已經(jīng)存進去的數(shù)據(jù)了
int i = curr_position;
while (i <= size ) {
parcel.setDataPosition(i);
int curr_int = parcel.readXXXt();
i+=4;
int j = 0;
j++;
}
這樣就ok 了
他的createXXX()方法現(xiàn)在沒用,用了在說吧!
總結(jié)一句話,Java 中 基本數(shù)據(jù)類型的取值范圍,引用類型的數(shù)據(jù),相當于c中的指針,以及各進制之間的相互轉(zhuǎn)換和靈活的引用,以及定制自己想要的任意進制數(shù)據(jù)類型。
更多關于Android相關內(nèi)容感興趣的讀者可查看本站專題:《Android數(shù)據(jù)庫操作技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android文件操作技巧匯總》、《Android編程開發(fā)之SD卡操作方法匯總》、《Android開發(fā)入門與進階教程》、《Android資源操作技巧匯總》、《Android視圖View技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設計有所幫助。
相關文章
Android ViewPager實現(xiàn)無限循環(huán)輪播廣告位Banner效果
這篇文章主要為大家詳細介紹了Android ViewPager實現(xiàn)無限循環(huán)輪播廣告位Banner效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07
解決genymotion模擬器無法聯(lián)網(wǎng)的正確方法100%成功
android 5.1版不能聯(lián)網(wǎng),三個步驟的設置就可以解決你的genymotion模擬器無法聯(lián)網(wǎng)的問題2018-03-03
Android RecyclerView實現(xiàn)水平、垂直方向分割線
這篇文章主要為大家詳細介紹了Android RecyclerView實現(xiàn)水平、垂直方向分割線,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07
Android開發(fā)中父組件調(diào)用子組件方法demo
這篇文章主要為大家介紹了Android開發(fā)中父組件調(diào)用子組件方法demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12

