您現在的位置是:電腦技術吧?>? 組裝維修 ??>??復雜對象,對象與別人關系復雜的說說??>??正文詳情

復雜對象,對象與別人關系復雜的說說

譚思遠2019-12-09 10:01:45 人圍觀
簡介get請求傳遞復雜對象介紹了Aidl傳輸復雜類型對象的特殊處理方法。通過進程間的Aidl接口傳輸系統允許的數據并不容易。如果需要傳輸復雜類型的對象,則需要進行一些額外的處理。如下

AIDL傳遞復雜類型對象的特殊處理  前面已經介紹了通過AIDL接口在進程間傳遞系統允許的數據,如果需要傳遞一個復雜類型的對象,就沒那么簡單了,需要額外做一些處理。

如下:  定義數據接口的AIDL文件中,使用parcelable關鍵字,例如:parcelable Message;  在其數據實現類中實現Parcelable接口,并實現對應的方法。

  在業務接口的AIDL文件中,使用import引入數據接口AIDL的包名。

  例如:Message.aidl  1 parcelable Message;  例如:IGetMsg.aidl  1 package com.example.aidlservicedemo.domain;  2  3 // 這是兩個自定義類  4 import com.example.aidlservicedemo.domain.Message;  5 import com.example.aidlservicedemo.domain.User;  6  7 interface IGetMsg{  8 // 在AIDL接口中定義一個getMes方法  9 List getMes(in User us);  10 }  Parcelable與Parcel接口  先來說說Android對象序列化,在Android中序列化對象主要有兩種方式,實現Serializable接口或是實現Parcelable接口。

Serializable接口是JavaSE原生支持的,而Parcelable接口是Android所特有的,它的序列化和反序列化的效率均比Serializable接口高,而AIDL進行在進程間通信(IPC),就是需要實現這個Parcelable接口。

  Parcelable接口的作用:實現了Parcelable接口的實例,可以將自身的數據信息寫入一個Parcel對象,也可以從parcel中恢復到對象的狀態。

而Parcel就是完成數據序列化寫入的載體。

  上面提到Parcel,再來聊聊Parcel是什么?Android系統設計之初,定位就是針對內存受限的設備,因此對性能要求更好,所以系統中采用進程間通信(IPC)機制,必然要求性能更優良的序列化方式,所以Parcel就被設計出來了,其定位就是輕量級的高效的對象序列化機制與反序列化機制。

如果讀一下Android的底層代碼,會發現Parcel是使用C 實現的,底層直接通過Parcel指針操作內存實現,所以它的才更高效。

  Parcel也提供了一系列的方法幫助寫入數據與讀取數據,這里簡單介紹一下:  obtain():在池中獲取一個新的Parcel。

  dataSize():得到當前Parcel對象的實際存儲空間。

  dataPostion():獲取當前Parcel對象的偏移量。

  setDataPosition():設置當前Parcel對象的偏移量。

  recyle():清空、回收當前Parcel對象的內存。

  writeXxx():向當前Parcel對象寫入數據,具有多種重載。

  readXxx():從當前Parcel對象讀取數據,具有多種重載。

  簡單來說,Parcelable通過writeToParcel()方法,對復雜對象的數據寫入Parcel的方式進行對象序列化,然后在需要的時候,通過其內定義的靜態屬性CREATOR.createFromParcel()進行反序列化的操作。

Parcelable對Parcel進行了包裝,其內部就是通過操作Parcel進行序列化與反序列化的。

  Parcelable與Parcel均定義在android.os包下,而這種機制不僅用于AIDL,還可以用于Intent傳遞數據等其他地方,這不是本篇博客的主題,以后用到再詳細介紹。

  實現Parcelable接口  定義好數據接口的AIDL文件后,需要定義一個數據實現類,實現Parcelable接口,并實現對應的方法,Parcelable有如下幾個必須要實現的抽象方法:  abstract int describeContents():返回一個位掩碼,表示一組特殊對象類型的Parcelable,一般返回0即可。

  asbtract void writeToParcel(Parcel dest,int flags):實現對象的序列化,通過Parcel的一系列writeXxx()方法序列化對象。

  除了上面兩個方法,還需要在實現類中定義一個名為CREATOR,類型為Parcelable.Creator的泛型靜態屬性,它實現了對象的反序列化。

它也有兩個必須實現的抽象方法:  abstract T createFromParcel(Parcel source):通過source對象,根據writeToParcel()方法序列化的數據,反序列化一個Parcelable對象。

  abstract T[] newArray(int size):創建一個新的Parcelable對象的數組。

  例如:  1 @Override  2 public int describeContents() {  3 return 0;  4 }  5  6 @Override  7 public void writeToParcel(Parcel dest, int flags) {  8 Log.i(main, 服務端Message被序列化);  9 dest.writeInt(id);  10 dest.writeString(msgText);  11 dest.writeString(fromName);  12 dest.writeString(date);  13 }  14  15 public static final Parcelable.Creator CREATOR = new Creator() {  16  17 @Override  18 public Message[] newArray(int size) {  19 return new Message[size];  20 }  21  22 @Override  23 public Message createFromParcel(Parcel source) {  24 Log.i(main, 服務端Message被反序列化);  25 return new Message(source.readInt(), source.readString(),  26 source.readString(), source.readString());  27 }  28 };  從上面示例中可以看出,使用writeToParcel()方法進行序列化,通過CREATOR.createFromParcel進行反序列化,它們都傳遞一個Parcel類型的對象,這里要注意的是兩個方法中Parcel對象的writeXxx()和readXxx()方法的順序必須一致,因為一般序列化數據是以鏈的形式序列化的,如果順序不對,反序列化的數據會出錯。

  AIDL傳遞復雜類型對象Demo  關鍵點已經講到, 下面通過一個簡單的Demo來演示AIDL傳遞復雜對象。

  AIDL接口:  com.example.aidlservicedemo.domain.Message.aidl  Message.aidl  com.example.aidlservicedemo.domain.Message.java  Message.java  com.example.aidlservicedemo.domain.User.aidl  User.aidl  com.example.aidlservicedemo.domain.User.java  User.java  服務:  com.example.aidlservicedemo.  CustomTypeService.java  客戶端:  com.example.aidlClientdemo.  CustomTypeActivity.java  效果展示:

  AIDL傳遞對象序列化過程詳解  通過上面Demo打印的日志,解釋一下序列化的過程,打開Logcat查看日志。

  從上圖的PID列可以看出這是兩個線程間的交互。

  流程是這樣的,客戶端傳遞一個User對象給服務端,服務端通過User對象處理數據,返回兩個Message對象給客戶端。

  首先,在客戶端傳遞給服務端User對象前,客戶端先把User對象序列化,然后傳遞給服務端之后,服務端接收到的是一段序列化后的數據,它再按照原定的規則對數據進行反序列化,然后處理User。

當服務端查到這個User有兩條Message時,需要傳遞這兩條Message對象給客戶端,在傳遞前對Message對象進行序列化,客戶端收到服務端傳遞過來的序列化后的數據,再根據既定的規則進行反序列化,得到正確的對象。

  從這個流程可以看出,在進程間傳遞的數據必定是被序列化過的,否則無法傳遞。

而對于那些AIDL默認允許傳遞的數據類型(int、double、String、List等),它們其實內部已經實現了序列化,所以無需我們再去指定序列化規則。

但是對于復雜類型對象而言,系統無法知道如何去序列化與反序列化,所以需要我們指定規則。

版權聲明:本文由 譚思遠 整理編輯。

原標題:簡述復雜對象及其特點,管不了對象的說說

轉載注明出處:http://www.dn9ww09s.icu/assemble/15258.html

上一篇:2c,8c

下一篇:jsp response,jspresponse對象

文章評論

    共有條評論來說兩句吧...

    用戶名:

    驗證碼:

作者推薦

  • excel編程有什么用,excel編程可以做什么

    excel編程有什么用,excel編程可以做什么 相關圖片excel編程語言Excel是一個優秀的電子表格軟件。如果您的程序需要以報告的形式顯示最終結果,這將是一個不錯的選擇。通過VB可以控制Excel顯示數據表。如果不想了解更多有關Eexcel編程計...

  • ASP,ASP是啥

    ASP,ASP是啥 相關圖片ASP技術方法如下:程序代碼%dim arr:set arr=new arraylistarr.add A:arr.add B:arr.add cressponse.wrASP模式...

  • Android多線程,Android開發多線程

    Android多線程,Android開發多線程 相關圖片android多線程同步Asynctask Asynctask是一個異步任務,可以執行簡單的異步操作,并將執行結果發布到UI主線程。Asynctask是一個抽象類。實際上,它結合了線程android多線程下載...

  • windows10安裝,win7安裝

    windows10安裝,win7安裝 相關圖片win7系統安裝使用自動安裝程序自動安裝MySQL新MySQL 5.0用戶可以使用MySQL安裝向導和MySQL配置向導在windows上安裝MySQL。這兩個向導的目的是方便怎么安裝win7系統...

  • webconfig在哪,webconfig怎么打開

    webconfig在哪,webconfig怎么打開 相關圖片webconfig文件不能用于一。修改IIS工作流程的最大數量。請考慮以下要點:1。每個工作進程都會消耗系統資源和CPU利用率,過多的工作進程會導致系統資源和CPU利用率的急劇消耗。每個工...

  • jsp response,jspresponse對象

    jsp response,jspresponse對象 相關圖片response最近,我們在做一個項目時遇到了一個問題。回應。Sendredirect()已添加,系統也已執行,但它只是沒有跳轉。最后,我們在網上發現了以下原因:首先,我們需要request與respons...

  • 獲取url參數,如何獲取url后面參數

    獲取url參數,如何獲取url后面參數 相關圖片前端獲取url參數Get URL including參數函數名:geturl role:Get URL including參數返回值:Get URL including參數'**url參數...

  • 建立網站的方式,怎么建立網站

    建立網站的方式,怎么建立網站 相關圖片網絡推廣方法 網站發布JSP網站最靈活的方法之一是將它配置到Tomcat目錄下的文件中,并在其主機標記中創建一個新的上下文標記來部署JSP應用程序。如果我們在這里部署它,那么我們網...

  • 如何去水印,水印

    如何去水印,水印 相關圖片微博水印設置叫水來?JPEG(filenameb)調用aspjpeg組件生成小縮略圖?JPEG(filenameb,filenames)設置JPEG=server.crea微博水印怎么去掉...

  • IP代碼,查看IP代碼

    IP代碼,查看IP代碼 相關圖片當前IP地址PHP代碼如果GetType=0,則獲取用戶的實際IP地址代碼公共函數getip(GetType),如果網站統計ip代碼...

熱評文章

  • mysql query,mysql_query失敗

    mysql query,mysql_query失敗 相關圖片mysql_query返回值PHP MySQL data seek()函數定義并使用MySQL data seek()函數將指針移動到內部結果。syntax MySQL[data]seeksql query...

  • 一鍵備份還原,電腦備份怎么還原

    一鍵備份還原,電腦備份怎么還原 相關圖片手機備份還原導入和導出涉及兩個命令:source和MySQL dump:1。導入:輸入MySQL命令行,輸入任何要導入的數據庫,然后導入。具體命令如下:進入windows的ghost備份還原...

  • EXIF信息,信息

    EXIF信息,信息 相關圖片android 圖片框架什么是EXIF?首先讓我們了解什么是EXIF。EXIF是一種圖像文件格式。它以JPEG格式存儲的數據完全相同。實際上,EXIF格式是JPEG格式,頭部插入數字照android長圖片處理...

  • 溫馨提示的意義,月度總結的目的和意義

    溫馨提示的意義,月度總結的目的和意義 相關圖片理論提示有哪些方法Microsoft VBScript語法錯誤(0800a03e9)>內存不足Microsoft VBScript語法錯誤(0800a03ea)>語法錯誤Micr對甲亢有提示意義的...

  • 2~7長度的中英文字符是多少,中英文字符

    2~7長度的中英文字符是多少,中英文字符 相關圖片中英文字符的名字函數strleng(str)ON ERROR RESUME NEXT dim WINNT_CHINESE WINNT_CHINESE=(len(論壇)=2)如W2到7位的中文字符或字母...

  • 2c,8c

    2c,8c 相關圖片1c抽象類和接口是面向對象編程中的兩個概念,但是研究編程多年的程序員有時并沒有明確的區別。下面解釋抽象類和接口的概念和區別。抽象類c點...

  • XXLive,X-

    XXLive,X- 相關圖片x y這個例子運行在MySQL 5.0和更高版本上。MySQL給用戶權限命令的簡單格式可以概括為:向用戶1授予對數據庫對象的權限,向普通數據用戶授予查詢、插入、更新和e^x...

  • wps默認保存路徑在哪,cad默認保存路徑

    wps默認保存路徑在哪,cad默認保存路徑 相關圖片保存修改相機照片默認保存路徑的方法是打開storage.java到:public static void updatedefaultdirectory(activiQQ下載文件保存位置...

  • 手勢識別,手勢識別的應用

    手勢識別,手勢識別的應用 相關圖片手勢有什么用簡單的手勢功能(左、右滑動屏幕)在項目中使用,因此下一個import android.content.context;import android.util.d手勢...

  • 讓控件不可被點擊,要使某控件在運行時不可見

    讓控件不可被點擊,要使某控件在運行時不可見 相關圖片要在垂直位置上移動控件在做VB項目時,每個人都會遇到這個問題。在VB中添加控件時,請瀏覽工程部件。添加所需零件時,會彈出一個對話框*。無法將OCX注冊為ActiveX控件。此時,您可...

關注微信

变脸官网查询