Android Intent传递大量数据出现问题解决

 更新时间:2022年07月28日 14:40:20   作者:AnRFDev  
这篇文章主要为大家介绍了Android Intent传递大量数据出现问题解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

官方文档 https://developer.android.google.cn/guide/components/activities/parcelables-and-bundles

在sendBroadcast,startActivity时,我们会用到Intent。 Intent可以携带一些数据,比如基本类型数据int、Boolean,或是String,或是序列化对象,Parcelable与Serializable。

异常TransactionTooLargeException

Intent传递数据时,如果数据太大,可能会出现异常TransactionTooLargeException。

注意:

在 Android 7.0(API 级别 24)或更高版本中,系统会在运行时抛出 TransactionTooLargeException 异常。在较低版本的 Android 中,系统仅在 logcat 中显示警告。

TransactionTooLargeException继承了RemoteException

package android.os;
public class TransactionTooLargeException extends RemoteException {
    public TransactionTooLargeException() {
        super();
    }
    public TransactionTooLargeException(String msg) {
        super(msg);
    }
}

追踪到Binder,它的transactNative方法会报出RemoteException

public native boolean transactNative(int code, Parcel data, Parcel reply,
            int flags) throws RemoteException;

抛出异常与Binder有关。

通过 intent 发送数据时,应小心地将数据大小限制为几 KB。发送过多数据会导致系统抛出 TransactionTooLargeException 异常。

Intent携带信息的大小受Binder限制

Intent携带信息的大小其实是受Binder限制。本文标题也可以改为“Binder传递数据大小限制”。

数据以Parcel对象的形式存放在Binder传递缓存中。 如果数据或返回值比传递buffer大,则此次传递调用失败并抛出TransactionTooLargeException异常。

Binder事务缓冲区有一个限定大小,通常是1Mb。由进程中正在处理的所有事务共享缓存空间。

由于此限制是进程级别而不是 Activity 级别的限制,因此这些事务包括应用中的所有 binder 事务,例如 onSaveInstanceStatestartActivity 以及与系统的任何互动。超过大小限制时,将引发 TransactionTooLargeException。

对于 savedInstanceState 的具体情况,应将数据量保持在较小的规模,因为只要用户可以返回到该 Activity,系统进程就需要保留所提供的数据(即使 Activity 的进程已终止)。我们建议您将保存的状态保持在 50k 数据以下。

为什么Binder要限制传输数据的大小

个人推测,作为一种IPC的方式,Binder并不是为传输大量数据而设计。

替代方案

当需要传递长字符串、Bitmap等时,不要考虑使用Intent传递数据的方案

1、单例

2、EventBus

3、Application

4、持久化数据

以上就是Android Intent传递大量数据出现问题解决的详细内容,更多关于Android Intent传递大量数据的资料请关注脚本之家其它相关文章!

相关文章

  • Android实现图片随手指旋转功能

    Android实现图片随手指旋转功能

    这篇文章主要为大家详细介绍了Android实现图片随手指旋转功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • 使用Android studio查看Kotlin的字节码教程

    使用Android studio查看Kotlin的字节码教程

    这篇文章主要介绍了使用Android studio查看Kotlin的字节码教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Android TabLayout(选项卡布局)简单用法实例分析

    Android TabLayout(选项卡布局)简单用法实例分析

    这篇文章主要介绍了Android TabLayout(选项卡布局)简单用法,结合实例形式简单分析了Android选项卡布局的界面布局与功能实现具体相关技巧,需要的朋友可以参考下
    2016-01-01
  • Android利用ViewDragHelper轻松实现拼图游戏的示例

    Android利用ViewDragHelper轻松实现拼图游戏的示例

    本篇文章主要介绍了Android利用ViewDragHelper轻松实现拼图游戏的示例,非常具有实用价值,需要的朋友可以参考下
    2017-11-11
  • Android zxing如何识别反转二维码详解

    Android zxing如何识别反转二维码详解

    这篇文章主要给大家介绍了关于Android zxing如何识别反转二维码的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • Android webview加载https链接错误或无响应的解决

    Android webview加载https链接错误或无响应的解决

    这篇文章主要介绍了Android webview加载https链接错误或无响应的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • android利用xml实现分割线

    android利用xml实现分割线

    这篇文章主要介绍了android利用xml实现分割线的方法,如何用xml产生一个分割线?感兴趣的小伙伴们可以参考一下
    2015-12-12
  • Android 中的危险权限详细整理

    Android 中的危险权限详细整理

    这篇文章主要介绍了Android 中的危险权限详细整理的相关资料,Android 中有上百种权限,现在将所有的权限归为两类,一类是普通权限,一类的危险权限,危险权限则表示那些可能会触及到用户安全隐私或者对设备安全造成影响的权限,需要的朋友可以参考下
    2017-07-07
  • Kotlin类型系统竟如此简单

    Kotlin类型系统竟如此简单

    这篇文章主要给大家介绍了关于Kotlin类型系统的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Kotlin具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • android中SharedPreferences实现存储用户名功能

    android中SharedPreferences实现存储用户名功能

    本篇文章主要介绍了android中SharedPreferences实现保存用户名功能,详细的介绍了SharedPreferences的功能,需要的朋友可以参考下
    2017-04-04

最新评论