我正试图通过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编码的照片) - 工作正常。
请帮忙。
答案 0 :(得分:7)
如果两个活动都是你的,请使用一个不错的数据模型。对于设计精良的应用程序,Android并不鼓励这么多。或者换一种方式,它允许快速开发的应用程序,并没有促进很多良好的软件应用原则。
@ Jean-Philippe Roy(魁北克?)的解决方案很有意思,但是当涉及到更精细的东西时,单身人士是一种反模式,即有状态的模型或服务。
最好的选择是使用应用程序类。这个类是你的单身,本质上是android。所以,
---在@ straya的回答和18个月的Android编程之后更新:)
在构建Android应用程序时,始终会考虑在应用程序,活动,视图和片段之间共享数据结构或进程的问题。重要的是要知道并考虑应用程序范围是保存共享结构的正确位置,但是使用应用程序类本身将数据结构放在该范围内是不可行的:
我现在倾向于使用依赖注入管理的单例。 Dagger或RoboGuice都允许创建给同一个类的单个实例并将其注入其他类。这种技术和DI通常为良好的Android设计提供了很好的可能性:
答案 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