2012-02-01 52 views
1

在我的应用程序中,我想在两个活动之间传递Parcelable对象(或Parcelable[])的ArrayList。在第一个活动中,我调用restservice来获取json数据,然后使用gson获取ListParcelable对象,然后使用putParcelableArrayListExtra(...)将该列表发送到第二个活动。所有的工作都很好,直到列表的大小大约为1000,但超过这个大小,我得到一个ANR,即使我等了几分钟,应用程序也不会恢复。Android使用Parcelable在活动之间发送数据

有没有解决这个问题的方法?是否由于将对象放置到意图的大小限制?

我知道我可以通过JSON字符串,然后获得第二个活动的列表,但我更喜欢先做这种操作。

回答

0

首先,确保您的ANR的确实是可以放大的大对象,而不是因为您正在主线程上执行阻塞操作(即联网)。

现在,如果ANR问题确实是由于这些大对象,完成这件事的正确方法是反序列化对象并写入到存储代替传递活动之间的。通过做你正在做的事情,你实际上将内存量翻了一番。

这里有一些方法可以解决此:

  • StrictMode: StrictMode最常用来捕捉偶然的磁盘或网络访问应用程序的主线程,在UI操作接收和动画上发生。通过保持应用程序的主线程响应,您还可以阻止向用户显示ANR对话框。

  • Traceview: Traceview是一个图形浏览器,用于查看由Android应用程序创建的日志。通过Traceview,您可以在应用程序中发现错误并测量其性能。

  • Memory Dump:您可以创建内存快照并使用Eclipse Memory Analyzer进行分析。

+0

我敢肯定,ANR是由于大parcelable因为网络的要求完成成的AsyncTask和retreiving结果后,我把结果的意图,并开始新的活动,这将不会出现。 .. – danidif 2012-02-02 16:01:04

+0

@danidif然后,如果是这样的话,你必须排除故障,看看究竟发生了什么(使用StrictMode,Traceview等)。我怀疑你的内存不足,这就是为什么我建议反序列化(并写入存储)而不是传递它。 – 2012-02-02 16:07:39

+0

它也尝试将整个json strig传递给Intent,并在第二个活动中使用gson获取对象,结果是:JAVA FAILED BINDER TRANSACTION ... – danidif 2012-02-02 16:12:12

相关问题