Android Parceable 使用和原理

news2024/11/25 2:59:52

简介

在 Android 开发中,我们经常需要在不同的组件之间传递数据,比如在 Activity 之间传递数据、在 Service 和 Activity 之间传递数据等。为了实现数据的传递,Android 提供了两种常用的方式,一种是使用 Intent,另一种是使用 Parcelable。在这里,我们将重点介绍 Parcelable 的使用。

Parcelable 是 Android 中用于序列化和反序列化 Java 对象的接口,它比 Java 中的 Serializable 接口更高效,因为它只序列化对象中的关键数据而不包含对象的完整状态。使用 Parcelable 接口可以减少对象序列化和反序列化的时间和开销,提高应用程序的性能。

在这里插入图片描述

Parcelable 代码示例

下面是一个使用 Parcelable 接口实现数据传递的示例代码:

首先定义一个 Student 类,实现 Parcelable 接口:

public class Student implements Parcelable {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    protected Student(Parcel in) {
        name = in.readString();
        age = in.readInt();
    }

    public static final Creator<Student> CREATOR = new Creator<Student>() {
        @Override
        public Student createFromParcel(Parcel in) {
            return new Student(in);
        }

        @Override
        public Student[] newArray(int size) {
            return new Student[size];
        }
    };

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
    }
}

在上面的代码中,我们定义了一个 Student 类,包含 name 和 age 两个属性。然后,我们实现了 Parcelable 接口,重写了 describeContents() 方法和 writeToParcel() 方法。在 writeToParcel() 方法中,我们将 name 和 age 属性写入 Parcel 对象中。在 Student 类中,我们还实现了一个 CREATOR 对象,用于反序列化 Parcelable 对象。

下面是在 Activity 中使用 Parcelable 传递数据的示例代码:

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Student student = new Student("Tom", 18);
        Log.d(TAG, "Student: " + student.getName() + ", " + student.getAge());

        Intent intent = new Intent(this, SecondActivity.class);
        intent.putExtra("student", student);
        startActivity(intent);
    }
}

在上面的代码中,我们创建了一个 Student 对象,然后将其作为参数传递给 Intent 对象的 putExtra() 方法。然后,我们启动了一个新的 Activity,将 Intent 对象传递给该 Activity。

下面是接收 Parcelable 数据的代码:

public class SecondActivity extends AppCompatActivity {
    private static final String TAG = "SecondActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        Student student = getIntent().getParcelableExtra("student");
        Log.d(TAG, "Student: " + student.getName() + ", " + student.getAge());
    }
}

在上面的代码中,我们使用 getIntent().getParcelableExtra() 方法获取传递过来的 Parcelable 对象,并将其转换为 Student 对象。

总的来说,Parcelable 接口是 Android 中传递数据的一种高效的方式,相比 Serializable 接口具有更好的性能。使用 Parcelable 接口可以减少对象序列化和反序列化的时间和开销,提高应用程序的性能。

Parcelable 为什么比 Serializable 高效

Parcelable 和 Serializable 都是 Java 中的序列化接口。Serializable 是 Java 标准库中的一个接口,而 Parcelable 是 Android 框架中的一个接口。

Parcelable 接口是为了解决在 Android 应用程序中序列化和反序列化对象时的效率问题而设计的。相比之下,Serializable 接口是一种通用的 Java 序列化接口,它不仅可以在 Android 中使用,还可以在其他 Java 应用程序中使用。

下面是 Parcelable 的原理和为什么它比 Serializable 更高效的详细说明:

Parcelable 的原理

Parcelable 接口的原理是将数据打包成一个 Parcel 对象进行传输。然后,将 Parcel 对象传输到另一个进程或组件,该进程或组件可以使用 Parcel 对象中的数据来创建一个新的对象。

Parcel 类是 Android 框架中的一个类,提供了一种快速序列化和反序列化数据的方式。Parcelable 接口的实现需要实现两个方法:writeToParcel() 和 describeContents()。

writeToParcel() 方法将对象的数据写入到一个 Parcel 中,而 describeContents() 方法返回一个标志位,表示该对象的特殊对象类型。

Parcelable 接口的实现需要实现以下步骤:

  • 在类的构造函数中读取 Parcelable 的数据;
  • 实现 writeToParcel() 方法,将类的数据写入到 Parcel 中;
  • 实现 CREATOR 对象,用于反序列化 Parcelable 对象。

实现 Parcelable 接口后,我们可以使用 Intent 或 Bundle 将 Parcelable 对象传递到另一个组件,然后在该组件中使用 getIntent().getParcelableExtra() 方法获取 Parcelable 对象。

Parcelable 比 Serializable 更高效的原因

Parcelable 接口比 Serializable 更高效的原因有以下几点:

  • Parcelable 是为 Android 应用程序设计的,因此它在设计上更加优化,可以更好地适应 Android 系统的特殊需求。
  • Parcelable 序列化和反序列化的速度更快,因为它只序列化对象中的关键数据而不包含对象的完整状态,而 Serializable 序列化和反序列化的过程需要多次经过 IO 操作,因此速度较慢。
  • Parcelable 创建的临时对象较少,因此它占用的内存较少,可以减轻垃圾回收的负担,提高性能。
  • Parcelable 可以更好地控制传输的对象,因为它可以选择只传输对象的部分数据而不是全部数据,因此可以更加高效地传输数据。

总之,Parcelable 比 Serializable 更高效,因为它是为 Android 应用程序设计的,速度更快,占用内存更少,并且可以更好地控制传输的数据。因此,在 Android 应用程序中,建议使用 Parcelable 来序列化和反序列化对象,以获得更好的性能和更高的效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/539394.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

opencv_c++学习(十)

一、图像尺寸变化 图像插值原理 在图像变换的过程中往往需要对像素进行相关的操作。如上图&#xff08;左&#xff09;所示&#xff0c;我们会遇到两个相邻的像素块需要映射到同样的位置中&#xff0c;或者两个相邻的位置的像素中间需要映射出一个位置的像素块。这时候我们就需…

JavaEE(系列7) -- 多线程(wait 和 notify 的使用)

首先对上一章节的指令重排序,在进行解释一下; 假设现在有连个线程 t1 和 t2 t1频繁(速度特别快)读取主内存&#xff0c;效率比较低&#xff0c;就被优化成直接读自己的工作内存。 t2修改了主内存的结果&#xff0c;由于t1没有读主内存&#xff0c;导致修改不能被识别到。 1.什么…

全网最全最细的【设计模式】总目录,收藏起来慢慢啃,看完不懂砍我

文章目录 一、设计模式七大原则1、单一职责原则2、接口隔离原则3、依赖倒置原则4、里氏替换原则5、开闭原则6、迪米特法则7、合成复用原则 二、UML类图三、设计模式1、创建型模式&#xff08;1&#xff09;单例模式&#xff08;常用&#xff09;&#xff08;2&#xff09;原型模…

mybatis-config.xml文件中的mappers标签

前言 在MyBatis中&#xff0c;< mapper >标签非常重要&#xff0c;因为它对应着我们存放sql语句的xml文件&#xff0c;在之前的使用中我们都是使用resource来指定路径&#xff0c;但其实除了resource可以指定路径的还有url和class但路径形式有所不同&#xff0c;下面来讨…

用「明道云+ChatGPT+Weaviate」挑战零代码1小时实现ChatPDF

ChatGPT流行起来之后&#xff0c;快速的出现了一批基于ChatGPT的工具应用&#xff0c;ChatPDF就是其中比较受欢迎的一款。它是一个可以让你与PDF文件进行对话的工具&#xff0c;既可以帮助你快速提取PDF文件中的信息&#xff0c;例如手册、论文、合同、书籍等&#xff1b;也可以…

【计算机视觉】最后显示的CIFAR-100数据集照片很模糊怎么解决?

文章目录 一、前言二、如何解决2.1 使用图像增强技术2.2 使用插值方法2.3 使用更高分辨率的图像数据集2.4 手动调整图像尺寸 三、总结 一、前言 如果从CIFAR-100数据集加载的图像显示模糊&#xff0c;可能有几个可能的原因&#xff1a; 分辨率较低&#xff1a;CIFAR-100数据集…

全力押注预制菜,叮咚买菜或错失即时零售红利

实际上&#xff0c;叮咚买菜相比于美团、京东更适合抢分即时零售的市场红利。 目前美团进入即时零售的逻辑是&#xff0c;拥有几百万骑手的履约软硬件可以复用&#xff0c;同时从外卖场景延伸到其他消费场景比较丝滑&#xff0c;从平台几千万用户的温饱满足&#xff0c;延展到多…

计算机网络实验(ensp)-实验10:三层交换机实现VLAN间路由

目录 实验报告&#xff1a; 实验操作 1.建立网络拓扑图并开启设备 2.配置主机 1.打开PC机 配置IP地址和子网掩码 2.配置完成后点击“应用”退出 3.重复步骤1和2配置每台PC 3.配置交换机VLAN 1.点开交换机 2.输入命名&#xff1a;sys 从用户视图切换到系统视图…

网络工程师精选习题详解(一)

请点击↑关注、收藏&#xff0c;本博客免费为你获取精彩知识分享&#xff01;有惊喜哟&#xff01;&#xff01; 1.在IPv4地址192.168.2.0/24中&#xff0c;表示主机的二进制位数是&#xff08; &#xff09;位。 A.8 B.16 C.24 D.32 答案&#xff1a;A /24示网络…

面对职业焦虑,我们能做些什么?

目录 大环境分析&#xff1a;AI 发展汹涌而上温水煮青蛙&#xff1a;那些“被替代”的“我们”码农分类&#xff1a;程序员都在做些什么码农黑暗季&#xff1a;失业潮原因分析程序员短期真的可替代吗&#xff1f;AI 发展来势汹汹&#xff0c;如何顺势而为最后&#xff1a;纵观全…

SpringBoot整合Swagger2,让接口文档管理变得更简单

在软件开发的过程中&#xff0c;接口文档的编写往往是一个非常重要的环节&#xff0c;因为它是前端和后端沟通的桥梁&#xff0c;帮助团队更好地协作。然而&#xff0c;手动编写接口文档不仅耗费时间&#xff0c;还容易出错&#xff0c;因此我们需要一种简单的方法来管理接口文…

宝武中南钢铁借助飞桨让钢筋超限监控有了“火眼金睛”

现代钢铁工业生产过程是一个复杂而庞大的生产体系&#xff0c;涵盖数百道工序。 在70多年的发展历程中&#xff0c;炼钢、轧钢、连铸以及节能减排等各项技术不断进化&#xff0c;无一不印证了中国钢铁在技术创新之路上获得的持续性突破。如今&#xff0c;宝武中南钢铁&#xff…

Java websocket 使用

简介 WebSocket 是一种基于 TCP 协议的全双工通信协议&#xff0c;可以在浏览器和服务器之间建立实时、双向的数据通信。在 Java 中&#xff0c;我们可以使用 Java API for WebSocket&#xff08;JSR 356&#xff09;来实现 WebSocket。 WebSocket 的作用是在 Web 应用程序中…

基于html+css的图展示77

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Charles安装及抓取APP接口

一、Charles使用 Charles是一款代理服务器&#xff0c;通过过将自己设置成系统&#xff08;电脑或者浏览器&#xff09;的网络访问代理服务器&#xff0c;然后截取请求和请求结果达到分析抓包的目的。该软件是用Java写的&#xff0c;能够在Windows&#xff0c;Mac&#xff0c;…

STM32F4_DAC数模转换

目录 1. DAC简介 2. DAC框图 3. DAC功能介绍 3.1 DAC通道使能 3.2 DAC输出缓冲器使能 3.3 DAC数据格式 3.4 DAC转换 3.5 DAC输出电压 3.6 DAC触发选择 3.7 DMA请求 3.8 生成噪声 3.9 生成三角波 4. 相关寄存器 4.1 DAC控制寄存器&#xff1a;DAC_CR 4.2 DAC1通道…

1-《java基础》

1-《java基础》 一.java基本数据类型和引用类型1.基本数据类型&#xff1a;2.引用数据类型3.基本数据类型和引用数据类型区别3.1 存储位置3.2 传递方式 4.自动装箱&#xff0c;自动拆箱 二.equals和的区别三.static1.static关键字的用途2.static方法3.static变量4.static代码块…

Unity中级客户端开发工程师的进阶之路

上期UWA技能成长系统之《Unity高级客户端开发工程师的进阶之路》得到了很多Unity开发者的肯定。通过系统的学习&#xff0c;可以掌握游戏性能瓶颈定位的方法和常见的CPU、GPU、内存相关的性能优化方法。 UWA技能成长系统是UWA根据学员的职业发展目标&#xff0c;提供技能学习的…

加密解密软件VMProtect教程(六):主窗口之控制面板“项目”部分(3)

VMProtect 是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic&#xff08;本机&#xff09;、Virtual Pascal和XCode编译器。 同时&#xff0c;VMProtect有一个内置的反汇编程序&#xff0c;可以与Windows和Mac OS X可执行文件一起…

wpf字符串格式化来实现空格占位 对齐问题Arial字符宽度不一致ChitGPT真牛

console是正常的。xml界面不正常&#xff0c;对不齐。 可能的原因各字符宽度不一致导致的。换个字体试试。黑体就正常。默认的Arial就不对。 在 C# 中&#xff0c;可以使用字符串格式化来实现空格占位。具体的做法是在格式字符串中使用占位符 {n}&#xff0c;其中 n 表示要占用…