讲师中心 微信公众号
AI工具推荐 视频效率加速

Android Activity间传递自定义对象列表:Gson序列化实践

千强君_2224

千强君_2224

发布时间:2025-11-30 13:52:01

|

529人浏览过

|

来源于php中文网

原创

Android Activity间传递自定义对象列表:Gson序列化实践

本教程详细介绍了在android应用中,如何通过intent高效地在不同activity之间传递包含自定义对象的arraylist。针对intent直接传递复杂对象列表的局限性,文章重点阐述了利用gson库将对象列表序列化为json字符串进行传递,并在目标activity中反序列化的完整流程,提供了详细的代码示例和注意事项,确保数据传输的便捷与可靠。

引言:Android Activity间数据传递的挑战

在Android应用开发中,Activity之间的数据传递是常见的需求。Intent作为Android组件间通信的核心机制,能够方便地传递基本数据类型(如int, String)以及实现了Serializable或Parcelable接口的对象。然而,当需要传递包含自定义复杂对象的ArrayList时,直接使用Intent会遇到一些挑战。虽然可以使自定义对象实现Serializable或Parcelable接口,但对于结构复杂的对象或嵌套对象,手动实现这些接口会增加代码的复杂性和维护成本。

为了解决这一问题,本教程将介绍一种更简洁、高效的方法:利用Google的Gson库将对象列表序列化为JSON字符串进行传递,并在接收端反序列化。这种方法尤其适用于自定义对象结构复杂,或当应用本身也涉及与JSON数据交互的场景。

Gson库简介与集成

Gson是一个Java库,由Google开发,用于在Java对象和JSON数据之间进行序列化(Java对象转JSON字符串)和反序列化(JSON字符串转Java对象)。它的主要优点是使用简单,无需额外的注解或接口实现即可处理大多数Java对象。

要使用Gson,首先需要在项目的build.gradle(Module: app)文件中添加其依赖:

dependencies {
    implementation 'com.google.code.gson:gson:2.10.1' // 使用最新稳定版本
}

添加依赖后,同步项目以确保Gson库被正确导入。

定义可传递的自定义对象类

在使用Gson传递自定义对象列表之前,我们需要定义好自定义对象的结构。Gson能够很好地处理标准的Java POJO(Plain Old Java Object),无需实现Serializable或Parcelable接口。

以示例中的ListeJoueurs类为例:

Google AI Mode Search
Google AI Mode Search

使用本地Google Cookie在Google AI模式中搜索,实时获取体育比分、股票价格、新闻、天气和AI摘要。

下载
public class ListeJoueurs {
    String Nom;
    String Prenom;
    Long Licence;
    String Cat;
    String Select;
    String dteN;
    int imageClick;

    // 构造函数
    public ListeJoueurs(String Nom, String Prenom, Long Licence, String Cat, String Select, String dteN, int imageClick) {
        this.Nom = Nom;
        this.Prenom = Prenom;
        this.Licence = Licence;
        this.Cat = Cat;
        this.Select = Select;
        this.dteN = dteN;
        this.imageClick = imageClick;
    }

    // Getter和Setter方法 (可选,但推荐添加以符合Java Bean规范)
    public String getNom() { return Nom; }
    public void setNom(String nom) { Nom = nom; }
    // ... 其他属性的Getter和Setter

    @Override
    public String toString() {
        return "ListeJoueurs{" +
               "Nom='" + Nom + '\'' +
               ", Prenom='" + Prenom + '\'' +
               ", Licence=" + Licence +
               ", Cat='" + Cat + '\'' +
               ", Select='" + Select + '\'' +
               ", dteN='" + dteN + '\'' +
               ", imageClick=" + imageClick +
               '}';
    }
}

注意: 虽然Gson不需要Getter/Setter方法也能工作(通过反射直接访问字段),但为了良好的编程实践和兼容性,建议为所有字段提供公共的Getter和Setter方法。

发送Activity中的数据序列化与传递

在发送数据的Activity中,我们需要完成以下步骤:

  1. 创建一个ArrayList实例并填充数据。
  2. 初始化Gson对象。
  3. 使用Gson将ArrayList序列化为JSON字符串。
  4. 将JSON字符串通过Intent.putExtra()方法放入Intent。
  5. 启动目标Activity。

以下是发送Activity(例如MainActivity)的代码示例:

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.google.gson.Gson;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); // 假设有一个布局文件

        Button sendButton = findViewById(R.id.send_data_button); // 假设有一个按钮

        sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 1. 创建并填充ArrayList<ListeJoueurs>
                ArrayList<ListeJoueurs> joueursList = new ArrayList<>();
                joueursList.add(new ListeJoueurs("Messi", "Lionel", 10001L, "Senior", "Yes", "1987-06-24", R.drawable.ic_launcher_foreground));
                joueursList.add(new ListeJoueurs("Ronaldo", "Cristiano", 70007L, "Senior", "Yes", "1985-02-05", R.drawable.ic_launcher_background));
                joueursList.add(new ListeJoueurs("Neymar", "Jr", 11011L, "Senior", "No", "1992-02-05", R.drawable.ic_launcher_foreground));

                // 2. 初始化Gson对象
                Gson gson = new Gson();

                // 3. 将ArrayList序列化为JSON字符串
                String jsonJoueursList = gson.toJson(joueursList);

                // 4. 将JSON字符串放入Intent
                Intent intent = new Intent(MainActivity.this, TargetActivity.class);
                intent.putExtra("joueurs_list_json", jsonJoueursList); // "joueurs_list_json" 是一个键,用于在接收端获取数据

                // 5. 启动目标Activity
                startActivity(intent);
            }
        });
    }
}

接收Activity中的数据反序列化与使用

在接收数据的Activity中,我们需要完成以下步骤:

  1. 从Intent中获取之前传递的JSON字符串。
  2. 初始化Gson对象。
  3. 使用Gson将JSON字符串反序列化回ArrayList。
  • 重要提示: 由于ArrayList是一个泛型类型,直接使用gson.fromJson(jsonString, ArrayList.class)会导致类型擦除问题。正确的方法是使用TypeToken来保留泛型信息。
  1. 使用反序列化后的数据。

以下是接收Activity(例如TargetActivity)的代码示例:

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;

public class TargetActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_target); // 假设有一个布局文件

        TextView dataTextView = findViewById(R.id.received_data_text); // 假设有一个TextView

        // 1. 从Intent中获取JSON字符串
        String jsonJoueursList = getIntent().getStringExtra("joueurs_list_json");

        if (jsonJoueursList != null && !jsonJoueursList.isEmpty()) {
            // 2. 初始化Gson对象
            Gson gson = new Gson();

            // 3. 使用TypeToken反序列化JSON字符串回ArrayList<ListeJoueurs>
            // 定义泛型类型
            Type listType = new TypeToken<ArrayList<ListeJoueurs>>() {}.getType();
            ArrayList<ListeJoueurs> receivedJoueursList = gson.fromJson(jsonJoueursList, listType);

            // 4. 使用反序列化后的数据
            if (receivedJoueursList != null && !receivedJoueursList.isEmpty()) {
                StringBuilder displayData = new StringBuilder("Received Joueurs:\n");
                for (ListeJoueurs joueur : receivedJoueursList) {
                    displayData.append(joueur.toString()).append("\n");
                }
                dataTextView.setText(displayData.toString());
            } else {
                dataTextView.setText("Received empty or null list.");
            }
        } else {
            dataTextView.setText("No data received.");
        }
    }
}

注意事项与最佳实践

  1. 依赖管理: 确保在项目的build.gradle中正确添加了Gson依赖,并且版本是最新的稳定版。
  2. 空值处理: 在接收Activity中,务必对getIntent().getStringExtra()的返回值进行空值检查。如果发送Activity没有传递该键值,或者传递的是null,直接使用可能导致NullPointerException。
  3. 数据量考量: 尽管Gson效率较高,但通过Intent传递超大数据量(例如几MB的JSON字符串)仍然不是最佳实践。Intent的IPC(进程间通信)机制对数据大小有限制,过大的数据可能导致TransactionTooLargeException。对于非常大的数据集,建议考虑其他数据传递方式,如:
    • 将数据存储到数据库(SQLite)。
    • 将数据写入文件或SharedPreferences,然后在接收Activity中读取。
    • 使用单例模式或EventBus等内存缓存机制(但需注意内存泄漏风险)。
  4. 类结构稳定性: 确保发送和接收Activity中ListeJoueurs类的结构(字段名、类型)保持一致。任何不一致都可能导致反序列化失败或数据丢失。
  5. 替代方案简述:
    • Parcelable: Android推荐的序列化接口,性能优于Serializable,但需要手动实现writeToParcel和createFromParcel方法,代码量较大。适用于对性能要求极高且对象结构相对固定的场景。
    • Serializable: Java标准序列化接口,实现简单(只需implements Serializable),但性能较差,且会创建大量临时对象,不推荐在Android IPC中大量使用。
    • 相比之下,Gson在易用性和与JSON生态的集成方面具有明显优势,特别是在处理复杂对象或需要与网络API交互时。

总结

通过本教程,我们学习了如何利用Gson库在Android Activity之间高效且便捷地传递包含自定义对象的ArrayList。这种方法避免了手动实现Parcelable或Serializable接口的繁琐,使得代码更加简洁、易于维护。在实际开发中,根据项目需求和数据规模,选择合适的Activity间数据传递策略至关重要。对于需要传递复杂对象列表的场景,Gson提供了一个优雅且强大的解决方案。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2255

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3622

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1216

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

4179

2025.09.10

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3311

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

554

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

562

2026.02.12

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7099

2023.08.02

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

0

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn