Intent.putExtras大小限制?

Tig*_*ger 5 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);
Run Code Online (Sandbox Code Playgroud)

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

startActivityForResult用黑屏调用挂起几分钟然后我得到ANR错误.onCreate根本没有调用子活动.

如果我不在mUsers中添加大字符串(没有Base64编码的照片) - 工作得很好.

请帮忙.

Sni*_*las 7

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

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

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

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

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

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

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

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

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