? ? ? ? 很久很久(大概兩個(gè)月吧)之前,在項(xiàng)目中遇到了這個(gè)問(wèn)題,就想著要記錄一下,然后就拖到了現(xiàn)在。所以本猿(其實(shí)人家是媛)得出一個(gè)重要推論:不要輕易放棄一個(gè)拖延癥重患,他想到的一定會(huì)做到,只是時(shí)間的問(wèn)題,就是不知道你們等不等的到(此處適合壞笑的表情)。
? ? ? ?當(dāng)測(cè)試找來(lái)這個(gè)bug的時(shí)候,本寶寶一頭霧水,沒(méi)崩,沒(méi)報(bào)啥常規(guī)錯(cuò),只見logcat空余一行:E: !!! FAILED BINDER TRANSACTION !!! (當(dāng)然是紅色)。然后寶寶開始Google,才發(fā)現(xiàn)原來(lái)是intent傳遞大容量數(shù)據(jù)產(chǎn)生的問(wèn)題,導(dǎo)致新Activity無(wú)法啟動(dòng)。問(wèn)題詳細(xì)分析請(qǐng)click?here
? ? ? ? 解決方案,我是采用的靜態(tài)成員變量方式實(shí)現(xiàn)大容量數(shù)據(jù)傳遞的(當(dāng)然也是參考別人的咯,畢竟現(xiàn)在巨人很多,有的是肩膀可站)。具體如下:
這個(gè)可以直接在activity中也可以單獨(dú)一個(gè)數(shù)據(jù)結(jié)構(gòu)體,就和單例差不多了。
比如:
public class DataHolder{
private static String data;
public static String getData(){returndata;}
public static String setData(Stringdata){this.data=data;}
}
啟動(dòng)之前設(shè)置數(shù)據(jù),新的activity獲取數(shù)據(jù)。
注意:這些情況如果數(shù)據(jù)很大很多,比如bitmap,處理不當(dāng)是很容易導(dǎo)致內(nèi)存泄露或者內(nèi)存溢出的。
所以可以考慮使用WeakReferences將數(shù)據(jù)包裝起來(lái)。
比如:
public class DataHolder{
Map<String, WeakReference<Object>> data = new HashMap<String, WeakReference>();
void save(String id,Object object{
data.put(id,new WeakReference<Object>(object));
}
Object retrieve(String id){WeakReference<Object>?objectWeakReference=data.get(id);
return objectWeakReference.get();}
}
啟動(dòng)之前:
DataHolder.getInstance().save(someId,someObject);
新activity中:
DataHolder.getInstance().retrieve(someId);
這里可能需要通過(guò)intent傳遞id,如果數(shù)據(jù)唯一,id都可以不傳遞的。save() retrieve()中id都固定即可。
? ? ? ? 最后寶寶要聲明:?jiǎn)栴}是自己遇到的,解決方法是別人的。所以寶寶只是小小的搬運(yùn)工,公德心還是有的,給你們 --> ??解決方法連接
大恩不言謝,所以膝蓋什么的就不用送了。