美文网首页
Intent传递数据量过大的问题android.os.Trans

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

作者: 一叶知秋from | 来源:发表于2019-01-15 17:14 被阅读0次

    在做相册多选时,相册选择界面跳转预览界面时需要通过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<String, WeakReference<Object>> 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<Object> weakReference = map.get(id);

            return weakReference.get();

        }

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

    // 照片路径集合List<LocalMedia> previewImages;

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

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

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

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

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

    相关文章

      网友评论

          本文标题:Intent传递数据量过大的问题android.os.Trans

          本文链接:https://www.haomeiwen.com/subject/jqwydqtx.html