安卓开发中,有时候使用intent或者bundle传递数据到下一个activity或者是fragment的时候会崩溃,仔细查找发现是数据量太大导致的崩溃,有些传递对象是一个bean,里面包含大量的图片,字符串,可能几百条,网络上大部分的做法是改为使用eventBus传递数据,我这里的做法是将需要传递的数据序列化(安卓最好使用parcelable,可以使用intent直接传递这种list数据类型)保存到本地,然后在接下来的页面里面读取这个数据就行
serializable的保存和读取:
private void saveAsSerializable(SerialData data) {
FileOutputStream fos;
ObjectOutputStream oos;
try {
fos = getApplicationContext().openFileOutput(KEY,
Context.MODE_PRIVATE);
oos = new ObjectOutputStream(fos);
oos.writeObject(data);
oos.close();
fos.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private SerialData readData() {
SerialData obj = null;
FileInputStream fis;
ObjectInputStream ois;
try {
fis = getApplicationContext().openFileInput(KEY);
ois = new ObjectInputStream(fis);
obj = (SerialData) ois.readObject();
ois.close();
fis.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (obj != null)
return obj;
else
return null;
}
parcelable数据的保存和读取:
protected void saveParce() {
FileOutputStream fos;
try {
fos = getApplicationContext().openFileOutput(key,
Context.MODE_PRIVATE);
BufferedOutputStream bos = new BufferedOutputStream(fos);
Parcel parcel = Parcel.obtain();
parcel.writeParcelable(new ParceData(), 0);
bos.write(parcel.marshall());
bos.flush();
bos.close();
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
protected void loadParce() {
FileInputStream fis;
try {
fis = getApplicationContext().openFileInput(key);
byte[] bytes = new byte[fis.available()];
fis.read(bytes);
Parcel parcel = Parcel.obtain();
parcel.unmarshall(bytes, 0, bytes.length);
parcel.setDataPosition(0);
ParceData data = parcel.readParcelable(ParceData.class.getClassLoader());
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}