Intent.putExtras大小限制?

时间:2012-02-21 20:25:15

标签: java android android-intent android-3.0-honeycomb

我正试图通过Intent.putExtras将数据从一个活动传递到另一个活动,如下所示:

private ArrayList<HashMap<String, String>> mGroups = new ArrayList<HashMap<String, String>>();
private ArrayList<HashMap<String, String>> mUsers = new ArrayList<HashMap<String, String>>();
...

Bundle data = new Bundle();
data.putInt("mode", mode);
data.putSerializable("groups", (Serializable) mGroups);
data.putSerializable("users", (Serializable) mUsers);
data.putInt("current_class", mCurrentClassId);
data.putInt("current_user", mCurrentUserId);

Intent intent = new Intent(ctx, ChildActivity.class);
intent.putExtras(data);
ctx.startActivityForResult(intent, 0);

此处mUsers是包含用户数据的HashMap<String,String>列表,包括Base64编码的照片,此列表中的字符串大小总和约为500Kb

使用黑屏呼叫startActivityForResult挂起几分钟,然后我收到ANR错误。根本没有调用子活动的onCreate

如果我没有在mUsers中添加大字符串(没有Base64编码的照片) - 工作正常。

请帮忙。

3 个答案:

答案 0 :(得分:7)

如果两个活动都是你的,请使用一个不错的数据模型。对于设计精良的应用程序,Android并不鼓励这么多。或者换一种方式,它允许快速开发的应用程序,并没有促进很多良好的软件应用原则。

@ Jean-Philippe Roy(魁北克?)的解决方案很有意思,但是当涉及到更精细的东西时,单身人士是一种反模式,即有状态的模型或服务。

最好的选择是使用应用程序类。这个类是你的单身,本质上是android。所以,

  • 在清单中定义应用程序类
  • 提供一个静态方法来访问应用程序类的唯一实例(它始终是一个单例)。
  • 为其提供接收和保存数据的方法,从第一个活动中调用
  • 和第二个让他们回到你的第二个活动

---在@ straya的回答和18个月的Android编程之后更新:)

在构建Android应用程序时,始终会考虑在应用程序,活动,视图和片段之间共享数据结构或进程的问题。重要的是要知道并考虑应用程序范围是保存共享结构的正确位置,但是使用应用程序类本身将数据结构放在该范围内是不可行的:

  • 代码质量,如果所有共享数据结构和流程都知道应用程序,它将很快变得臃肿,并具有所有这些实体的访问器。
  • 只有一个全局共享实体池,找不到足够的粒度,可能导致难以检测耦合实体的方式

我现在倾向于使用依赖注入管理的单例。 Dagger或RoboGuice都允许创建给同一个类的单个实例并将其注入其他类。这种技术和DI通常为良好的Android设计提供了很好的可能性:

  • 不会降低代码质量,甚至会缩短很多。使用@Inject注入依赖项,它们将被注入。
  • 不对单例类赋予2个职责:它不会处理单例实例创建,框架会这样做。
  • 从单例传递到普通实例更容易
  • 因为这些单例成为具有简单注释的普通类,它们不再包含静态方法,这允许非常容易地模拟它们。这是一个重点。
  • 当然,DI注释使得一个类依赖于另一个类时非常清楚,有助于自我更多地记录代码。

答案 1 :(得分:0)

回应Snicolas的回答:

应用程序已经是Singleton,无需“将其转为”。

就个人而言,在严重依赖应用程序长期保存数据之后,我完全不相信它。我使用自缓存数据对象来缓解问题;)

答案 2 :(得分:0)

进程级别而不是捆绑包级别,最大大小为 1MB 。这1MB用于共享缓冲区,供应用程序进程中进行中的所有状态事务使用,例如onSaveInstanceState,startActivity等。

在Android 7.0(API级别24)及更高版本上,达到此进程级别限制时,系统将引发TransactionTooLargeException。在旧版本中,您只会收到警告。

因此,其他人建议,如果您需要传递更大的有效负载(例如,使用本地数据库,文件系统,应用程序级内存中缓存,远程存储,共享首选项(尽管这些首选项也必须很小)等。

真相来源:https://developer.android.com/guide/components/activities/parcelables-and-bundles