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子类来管理会更规范:
- 先写自定义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; } }
- 在
AndroidManifest.xml的<application>标签里指定这个类:
<application android:name=".MyApp" <!-- 其他属性不变 --> ...> </application>
- 然后在Activity_1里设置:
MyApp myApp = (MyApp) getApplication(); myApp.setGlobalArray(yourValidArray);
- Activity_2里获取:
MyApp myApp = (MyApp) getApplication(); String[] receivedArray = myApp.getGlobalArray();
小提醒
- 用单例或Application存储的数据,在App进程被系统回收时会丢失,如果需要持久化保存,得考虑用SharedPreferences(适合小数据)、本地文件或者数据库。
- 传递大数组的时候,Intent可能会有大小限制,这时候优先考虑单例或Application方案。
内容的提问来源于stack exchange,提问作者Mxwan
相关产品推荐
相关产品推荐

