【Android】Intentのデータ転送量が大きすぎる問題android.os.TransactionTooLargeException
3046 ワード
アルバムの複数選択を行う場合、アルバム選択インタフェースがプレビューインタフェースにジャンプする際には、Intentを介してすべての写真のデータをPreviewActivity(プレビューインタフェース)に渡す必要があるが、データ量が大きいとプログラムがクラッシュし、エラーメッセージはandroidである.os.TransactionTooLargeExceptionは、後に公式資料(https://developer.android.com/reference/android/os/TransactionTooLargeException.html)Inetent、Bundleなどのデータ転送時に1つのバッファがあり、このバッファは最大1 MBしかないので、データ量が大きいとこのようなエラーが発生します.この時点ではIntentでデータを渡すことはできません.WeakReferenceを使用してデータを一時的に保存できますが、GCには影響しません.コードは次のとおりです.
次に、データを渡す必要がある場所でsave()メソッドを呼び出します.
最後にPreviewActivityでget()メソッドを呼び出して写真データを取得します.
public class WeakDataHolder {
private static WeakDataHolder instance;
public static WeakDataHolder getInstance(){
if(instance == null){
synchronized (WeakDataHolder.class) {
if (instance == null) {
instance = new WeakDataHolder();
}
}
}
return instance;
}
private Map> map = new HashMap<>();
/**
*
* @param id
* @param object
*/
public void saveData(String id, Object object) {
map.put(id, new WeakReference<>(object));
}
/**
*
* @param id
* @return
*/
public Object getData(String id) {
WeakReference
次に、データを渡す必要がある場所でsave()メソッドを呼び出します.
// List previewImages;
WeakDataHolder.getInstance().saveData("2", previewImages);
最後にPreviewActivityでget()メソッドを呼び出して写真データを取得します.
images = (List) WeakDataHolder.getInstance().getData("2");