Intent传递数据量过大的问题android.os.TransactionTooLargeException

在做相册多选时,相册选择界面跳转预览界面时需要通过Intent将所有照片的数据传递给PreviewActivity(预览界面),而当数据量大的时候程序会崩溃,错误信息是android.os.TransactionTooLargeException,后来通过查阅官方资料(https://developer.android.com/reference/android/os/TransactionTooLargeException.html)发现Inetent、Bundle等传递数据时有一个缓冲区,而这个缓冲区最大只有1MB,所以当数据量大时会出现如上错误。这个时候就不能通过Intent来传递数据了。可以使用WeakReference将数据临时保存一下,这也不会影响到GC。代码如下:

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 weakReference = map.get(id);

        return weakReference.get();

    }

然后在需要传递数据的地方调用save()方法:

// 照片路径集合List previewImages;

WeakDataHolder.getInstance().saveData("2", previewImages);

最后在PreviewActivity调用get()方法获取照片数据:

images = (List) WeakDataHolder.getInstance().getData("2");

---------------------

原文:https://blog.csdn.net/dayun220/article/details/77720473

你可能感兴趣的:(Intent传递数据量过大的问题android.os.TransactionTooLargeException)