在我的应用程序中,我通过Activity
个附加内容向我的Intent
发送数据。
在我的具体情况下,我下载了JSON
个文件,将其内容转换为String
,然后将Intent
个额外的内容发送到我的Activity
。大小约为500kB。
我得到TransactionTooLargeException
。
09-28 13:40:46.647: E/JavaBinder(441): !!! FAILED BINDER TRANSACTION !!!
09-28 13:40:46.647: W/ActivityManager(441): Exception in new application when starting activity com.vektor.sourfer/.SourceActivity
09-28 13:40:46.647: W/ActivityManager(441): android.os.TransactionTooLargeException
09-28 13:40:46.647: W/ActivityManager(441): at android.os.BinderProxy.transact(Native Method)
09-28 13:40:46.647: W/ActivityManager(441): at android.app.ApplicationThreadProxy.scheduleLaunchActivity(ApplicationThreadNative.java:723)
09-28 13:40:46.647: W/ActivityManager(441): at com.android.server.am.ActivityStack.realStartActivityLocked(ActivityStack.java:716)
09-28 13:40:46.647: W/ActivityManager(441): at com.android.server.am.ActivityManagerService.attachApplicationLocked(ActivityManagerService.java:4341)
09-28 13:40:46.647: W/ActivityManager(441): at com.android.server.am.ActivityManagerService.attachApplication(ActivityManagerService.java:4405)
09-28 13:40:46.647: W/ActivityManager(441): at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:390)
09-28 13:40:46.647: W/ActivityManager(441): at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:1737)
09-28 13:40:46.647: W/ActivityManager(441): at android.os.Binder.execTransact(Binder.java:388)
09-28 13:40:46.647: W/ActivityManager(441): at dalvik.system.NativeStart.run(Native Method)
09-28 13:40:46.647: W/ActivityManager(441): Force removing ActivityRecord{421bbed8 u0 com.vektor.sourfer/.SourceActivity}: app died, no saved state
在这种情况下,哪种方法可以绕过此错误?
答案 0 :(得分:4)
传输的数据大小限制为1MB,但它实际上更小,并且特定于设备。你是如何转移这个字符串的?通过putExtra(String string)方法?您应该尝试将其包装为Serializable,因为如果可能的话,它会做一些聪明的事情,每个字符只使用一个字节。但是如果你的字符串大于这个,那么你太接近极限,所以你应该把它保存到磁盘而不是传输。
我写了一篇关于这个主题的blog post,对于任何得到这个例外的人来说都很有趣。
答案 1 :(得分:3)
一种解决方案是将数据保存到公共静态成员变量中,然后从第二个活动访问它。
另一种解决方案是将结果保存到外部存储器上的文件中,然后从该文件中读取它。
答案 2 :(得分:1)
第一种方法: 由于您使用的是Json,请使用JsonReader
https://sites.google.com/site/gson/streaming
此代码读取包含消息数组的JSON文档。它 逐步遍历数组元素作为流,以避免加载完整 记录到内存中。它简洁,因为它使用Gson 用于解析各个消息的对象模型:
public List<Message> readJsonStream(InputStream in) throws IOException {
JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
List<Message> messages = new ArrayList<Message>();
reader.beginArray();
while (reader.hasNext()) {
Message message = gson.fromJson(reader, Message.class);
messages.add(message);
}
reader.endArray();
reader.close();
return messages;
}
第二种方法: 保存文件并将文件URI /路径传递给第二个活动。