【问题标题】:TransactionTooLargeException when sending large data through intent extras [duplicate]通过 Intent Extras 发送大数据时出现 TransactionTooLargeException [重复]
【发布时间】:2013-10-04 16:26:52
【问题描述】:

在我的应用程序中,我通过Intent 额外发送数据到我的Activity

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

在这种情况下,绕过此错误的最佳方法是什么?

【问题讨论】:

标签: android android-intent


【解决方案1】:

一种解决方案是将数据保存到公共静态成员变量中,然后从第二个活动中访问它。

另一种解决方案是将结果保存到外部存储上的文件中,然后从该文件中读取。

【讨论】:

    【解决方案2】:

    第一种方法: 既然你用的是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,对于遇到这个异常的人来说可能会很有趣。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多