2013-09-28 50 views
3

在我的应用程序中,我通过Intent附加组件发送数据到我的ActivityTransactionTooLargeException通过意图额外发送大数据时

在我的具体情况下,我下载了一个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 

在这种情况下,哪种方法可以绕过这个错误?

+1

阅读本文http://stackoverflow.com/a/8192532/786337 – Tarun

+1

使用sharedprefernces共享数据并在使用后删除 –

回答

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 /路径第二个活动。

3

对于传输的数据大小有1MB的限制,但实际上它更小并且特定于设备。你如何传输这个字符串?通过putExtra(String string)方法?你应该试着把它作为一个Serializable包装起来,因为如果可能的话,它会做一些聪明的事情,每个字符只使用一个字节。但是,如果你的字符串可能比这个大,那么你太接近极限了,所以你应该很可能把它保存到磁盘上,而不是传输。

我写了一个blog post关于这个问题,这可能是有趣的任何人得到这个例外。

相关问题