2011-08-30 54 views
2

我知道這個問題已經被問過很多次了,並且我經歷了很多這些問題......幾乎所有這些問題都會拋出對您的課程使用parcelable接口。 然而,在一對夫婦的問題,我碰到一個報價:在應用程序中,在活動之間傳遞自定義對象的最佳方式是什麼?

「注意:看Parcelable可能引發的問題,爲什麼Android的未使用 內置Java序列化機制事實證明,Android團隊來的?到 的結論是:中的序列化太慢,不足以滿足Android的進程間通信 的要求,所以團隊構建了Parcelable解決方案 Parcelable方法要求 明確地序列化類的成員,但是在最後,你會得到一個更快的 序列化你的對象。 也意識到,Android提供兩種機制允許您將數據傳遞給另一個 進程。第一種方法是使用意圖將捆綁傳遞給活動,第二種方法是將Parcelable傳遞給服務。 這兩種機制不可互換,不應該被 搞糊塗了。也就是說,Parcelable並不意味着被傳遞給一個活動。如果您想要啓動 活動並將其傳遞給一些數據,請使用一個包。 Parcelable旨在僅作爲的 的AIDL定義的一部分「。

這句話也可以在書臨的Android 2.

現在看到的被發現,在相同的同一應用程序運行的所有活動進程(Every Activity in Android is a Process,or One Application is one process),除非清單中另有規定,否則同一應用程序的活動內部的通信本身不是進程間通信。所以使用parcelable類真的更快,或者它足以通過bundle傳遞對象屬性意向?

在這方面脫落任何光將大大讚賞。 乾杯!

+0

我個人使用,從應用擴展類,並將其作爲靜態也許這是不是最好的做法,但它的偉大工程。 – PedroAGSantos

回答

8

對此,有一個FAQ。 :)

簡短的回答是,Android團隊推薦三種技術在應用程序中的活動和服務之間傳遞數據:單例類;公共靜態字段或方法;對象的弱引用的HashMap(並且你在意圖中傳遞密鑰)。需要記住的主要問題是您的數據在各種生命週期事件下的表現如何。 (例如,如果用戶打開手機,默認情況下,您的活動將被銷燬並重新創建;您的數據處理方法需要設計時考慮到這一點。)

+0

ty !!非常有價值! – Ashwin

5

Parcelable構造被設計爲在跨應用程序內存邊界傳遞數據時非常快速:在應用程序中,您使用Bundle更好地服務Bundle,因爲數據存儲在內的所有內存位置均可供發送方和接收方訪問。由於內存中的對象是可訪問的,因此不需要承擔重構的代價:只需使用Bundle,它實際上只是具有特定於類型的put/get方法而被優化的HashMap

對於AIDL和IPC目的,你不能(默認)共享存儲位置,所以你需要移動數據的有效途徑:這就是Parcelable踢除非你的應用程序的組件之一是使用remote過程。能力,那麼就沒有必要使用Parcelable

+0

我也這麼認爲!但泰德跳到那裏提供了一個很好的鏈接來解決它!反正乾杯! – Ashwin

1

docs

Parcelables並

的Parcelable協議提供對象寫入和從 包裹讀本身是一種非常有效的(但 低級別)協議。您可以使用直接的方法writeParcelable(Parcelable, int)和readParcelable器(classloader)或writeParcelableArray(T [],INT) 和readParcelableArray器(classloader)寫入或讀取。這些方法 寫兩個類的類型和它的數據到包裹,允許該 類從適當的類加載器,當以後 讀數進行重構。

也有一些方法提供一種更有效的方式工作 與Parcelables並:writeTypedArray(T [],INT),writeTypedList(列表), readTypedArray(T [],Parcelable.Creator)和readTypedList(列表, Parcelable.Creator)。這些方法不會寫入原始對象的類信息 :相反,讀取函數的調用者必須知道需要什麼類型,並在相應的Parcel.Creator中傳遞,而不是正確構造新對象,並且讀取其數據(請參閱 ) 。 (爲了更高效的寫入和讀取單個Parceable 對象,你可以直接調用Parcelable.writeToParcel和 Parcelable.Creator.createFromParcel自己。)

捆綁

一種特殊類型安全的容器,被稱爲捆綁,可用於 異質值的鍵/值映射。讀取和寫入數據時,這對提高性能許多優化 ,其 類型安全的API避免了難以調試類型錯誤時,終於 編組的數據內容爲一個包裹。使用的方法是 writeBundle(束),readBundle(),和readBundle(類加載器)。

相關問題