Android Parceable 使用和原理

简介

在 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 来序列化和反序列化对象,以获得更好的性能和更高的效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python徐师兄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值