2010-08-24 16 views
6

Diziselleştirilebilir veya ayrıştırılabilir nesnelerle Bundle kullanırken, marshalling gerçekte ne zaman gerçekleşir? Onu pakete koyar mısın? Demetler çoğunlukla iki ekran arasındaki veriden geçmek için kullanıldığından (burada IPC'den bile bahsetmiyoruz!), Bir nesneyi sıraya sokmakta çok fazla bir nokta yoktur, çünkü her zaman hafızada kalır. ? Seri haline getirilebilir bir nesne, bir pakete konduğunda her zaman seri hale getiriliyor mu?

sağ varsayarak içinde OLDUK marshalling (olsun Java seri hale veya Android parselasyon)

  1. veri başka bir işlem, örneğin geçirilen gerekiyorsa sadece olur RMI veya
  2. sırasında bileşen (etkinlik veya hizmet) yok olur ve örnek durum diske yazılmalıdır?

gördüğüm Android çerçeve mühendisleri (Ben Dianne Hackborn olduğuna inanmak) eski çok daha hızlı olduğu için bir Parcelable yerine Serializable kullanması gerektiğini söylüyor. Ne kadar hızlı? Nesnenin birçoğunun birçoğunun bir daha uyuşmaması durumunda bu durum bir fark yaratacaktır (bu konudaki varsayımlarımız doğruyduysa)?

cevap

6

Sanırım bunu çözdüm. Temelde bütün son gün geçirdi ve günümüzün en ayıklama Android Parcel ve Bundle kaynak koduna göz ve burada nasıl işliyor:

  • bir Bundle temelde HashMap etrafında sarıcı, ancak destekler Eğer bir paket içine bir değer koyarsanız, ilk olarak bu iç harita unparcel ve sonra basitçe bu harita harita unparceling
  • içine değerini koyacağız
  • parsel (yani mareşal) iç harita ve içeriği tembel olur: o Sadece erişmeye çalışıyorsanız (örneğin bundle.putParcelable() öğesini arayarak) unfolcel edecektir. O zaman bile, haritanın kendisini değil, sadece kendi değerlerini değil. Sadece bu değerlere gerçekten erişmeye çalıştığınızda (ör. Bundle.getParcelable ("anahtar") kullanarak), değeri de ayrıştırır. Başka bir deyişle, bir Bundle içindeki bir şeyi parse ederseniz, bu değerlere bir daha erişemezseniz, eşitsizleştirme gerçekleşmez. Yani genel olarak

: HAYIR, bir değer bir Paket içine koyarak sadece parcelled değildir. Bunun yerine, paketlemeyi Bundle'ı başka bir bileşene geçirirken (aktivite veya hizmet; Android bunu neden yapar, bilmiyorum, teknik olarak hiçbir IPC olmadığı için) veya aksi halde parse edilmesi gerektiğinde gerçekleşir.

+0

sorumluluk reddi: Bu, uygulamanızın hatalarını ayıklamaktan aldığım neredeyse bir şey. 'N' ve 'M' denilen değişkenlerle dolu olan kaynak kodunun okunması en eğlenceli şey değildir, bu yüzden belki bir şeyi özlüyorum :-) – Matthias

+0

sorumluluk reddi 2: Sadece yanlış anlamaları önlemek için, bu değişkenler Bundle kaynak kodunun bir parçasıydı kendi: -D – Matthias

0

Sanırım hemen gerçekleşiyor. Ve performans artışının işe seri hale getirilmesi gerekli olan yansıma nedeniyle olduğunu düşünüyorum. Sanırım seri hale getirilebilir ve dışsallaştırılabilir arasındaki performans farkı ile aynı.