2014-10-20 69 views
4

我是Android新手,但我已經完成了很多服務器端Java。Android:反射不好?

我在讀關於意圖,特別是通過SerializableParcelable發送額外數據(類)之間的差異。似乎有一個共識,認爲Serializeable性能不佳,Parcelable是首選。在一些地方,我看到它說Serializeable不好,因爲它使用反射。

這導致一對夫婦對我的問題:

  1. 是一般的反射認爲是壞?我應該避免任何依賴反思的圖書館嗎?例如,如果我需要JSON反序列化(來自某些Web服務),我應該使用Jackson還是Gson?而不是?那org.json垃圾在Android-land中真的是「最佳實踐」嗎?

  2. 如果我真的應該避免反思(因此Serializable),是否有任何替代醜陋的,樣板的Parcelable?意圖都是明確的,我不會在應用程序外廣播它們。我想我不明白爲什麼進程內消息傳遞不能僅僅傳遞對Intent內對象的引用。

+0

org.json也使用反射。它只是更輕量級和功能差。 – 2014-10-20 01:29:14

+0

我會說它不應該被認爲是壞的,但你應該避免使用它,如果你可以的話。 – dazito 2014-10-20 01:50:24

+0

@dwnz事情是,我總是可以避免它,但通常最好的庫使用它來避免大量的樣板代碼。因此,簡明和明確的代碼與性能問題之間有很大的折衷。這些擔憂是真的嗎?我應該拒絕每個主要的JSON解析器並找到一個不使用反射的解析器嗎? – Kevin 2014-10-20 16:46:48

回答

0
RE

問題#2:

I guess I don't understand why in-process messaging can't just pass a reference to the object inside the Intent. 

Parcelizing(或串行化)的對象允許的Android重新創建它當含活性是重新創建本身。 Android控制活動的生命週期 - 並且可以隨時銷燬活動,即使活動/活動可見(例如,屏幕旋轉,回收內存以處理傳入的電話,...)。當Android重新創建您的活動時,它將傳遞一個名爲Bundle的對象,該對象包含所有的分段對象。這允許您恢復活動的狀態,但請注意,這些不是原始對象 - 它們已從其包裹表示中重新構建。

is there any alternative...? 

如果您希望能夠正確地重新創建活動,那麼可以選擇分段和序列化。然而,我不會那麼快排除序列化。雖然通常它性能較差,但在很多情況下,這可能不會被用戶檢測到。請記住,Android的設計是在移動設備的處理能力比現在低得多的時候設計的。因此,像parcelability這樣的性能優化可能更受關注。

另一個值得一提的選擇是,將對象自己寫入磁盤可能性能更差。然後在意圖中,傳遞一個指向該文件(或數據庫記錄)的指針。其中的一個變體是使用Android SharePreferences保存數據。我只提到這一點,因爲在Intent中傳遞大量數據有時會失敗。對最大物體尺寸沒有硬性限制,但包括我在內的許多人都看到了這種失敗。