You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android两个Activity间共享ArrayList异常:自定义Provider类获取为空

解决两个Activity间数组传递为空的问题

嘿,这个问题我太熟了!你踩的坑其实很典型——你在Activity_1和Activity_2里分别new了array_provider.class的对象,这是两个完全独立的实例,它们各自维护自己的数组变量,所以Activity_2调用getArray()拿到的只是新实例里的空数组,和Activity_1里设置的那个半毛钱关系都没有~

下面给你几个靠谱的解决方案,按需选就行:

方案1:把ArrayProvider改成单例模式

这是最直接的方式,确保整个应用里只有一个ArrayProvider实例,数据自然就共享了。示例代码如下:

public class ArrayProvider {
    // 全局唯一实例
    private static ArrayProvider sInstance;
    // 你的数组变量,改成自己需要的类型
    private String[] mTargetArray;

    // 私有构造方法,禁止外部直接new
    private ArrayProvider() {}

    // 获取单例的方法,加同步锁保证线程安全
    public static synchronized ArrayProvider getInstance() {
        if (sInstance == null) {
            sInstance = new ArrayProvider();
        }
        return sInstance;
    }

    // Getter & Setter
    public String[] getArray() {
        return mTargetArray;
    }

    public void setArray(String[] array) {
        mTargetArray = array;
    }
}

使用的时候,Activity_1里这么写:

// 初始化并设置数组
ArrayProvider.getInstance().setArray(yourValidArray);

Activity_2里直接拿:

String[] receivedArray = ArrayProvider.getInstance().getArray();
// 这里拿到的就是Activity_1里设置的有效数组啦

方案2:用Intent直接传递数组

如果你的数组是基本类型、String,或者自定义对象实现了Serializable/Parcelable接口,直接用Intent传递更简单,不需要额外的Provider类。

比如Activity_1跳转时:

Intent intent = new Intent(Activity_1.this, Activity_2.class);
// 传递String数组,其他基本类型数组同理(比如int[]用putExtra("KEY", intArray))
intent.putExtra("EXTRA_MY_ARRAY", yourValidArray);
startActivity(intent);

Activity_2里接收:

// 拿String数组,对应类型用对应的getXXXExtra方法
String[] receivedArray = getIntent().getStringArrayExtra("EXTRA_MY_ARRAY");

要是你传递的是自定义对象数组,记得让对象类实现Serializable接口,然后用getSerializableExtra强转就行。

方案3:用Application类存全局数据

如果你的应用里有很多全局共享的数据,自定义一个Application子类来管理会更规范:

  1. 先写自定义Application类:
public class MyApp extends Application {
    private String[] mGlobalArray;

    @Override
    public void onCreate() {
        super.onCreate();
        // 可以在这里做一些初始化操作
    }

    public String[] getGlobalArray() {
        return mGlobalArray;
    }

    public void setGlobalArray(String[] array) {
        mGlobalArray = array;
    }
}
  1. 在AndroidManifest.xml的<application>标签里指定这个类:
<application
    android:name=".MyApp"
    <!-- 其他属性不变 -->
    ...>
</application>
  1. 然后在Activity_1里设置:
MyApp myApp = (MyApp) getApplication();
myApp.setGlobalArray(yourValidArray);
  1. Activity_2里获取:
MyApp myApp = (MyApp) getApplication();
String[] receivedArray = myApp.getGlobalArray();

小提醒

  • 用单例或Application存储的数据,在App进程被系统回收时会丢失,如果需要持久化保存,得考虑用SharedPreferences(适合小数据)、本地文件或者数据库。
  • 传递大数组的时候,Intent可能会有大小限制,这时候优先考虑单例或Application方案。

内容的提问来源于stack exchange,提问作者Mxwan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:38:00