2014-10-20 64 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中传递大量数据有时会失败。对最大物体尺寸没有硬性限制,但包括我在内的许多人都看到了这种失败。