Android Intent传递Map<Integer,Bean>及List<Bean>类型值问题完美解决

问题:

  1. 在Android开发中传递Map时特别Map值是自定义Bean时遇到的一些问题,有时抱异常,如以下异常:
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object 

原因:

Map或者Bean实体类没有做序列化,或者只实例化了一个
下面是例子:
  • 用到的工具类:CourseItemInfo.java
import java.io.Serializable;

/**
 *注意实体类必须序列化
 * Created by yongjie on 2017/1/1.
 */

public class CourseItemInfo implements Serializable {
    //章节
    private Integer section;
    //课程名称
    private String courseName;
    //视频地址
    private String localUrl;

    public Integer getSection() {
        return section;
    }

    public void setSection(Integer section) {
        this.section = section;
    }

    public String getLocalUrl() {
        return localUrl;
    }

    public void setLocalUrl(String localUrl) {
        this.localUrl = localUrl;
    }

    public String getCourseName() {
        return courseName;
    }

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }

    @Override
    public String toString() {
        return "CourseItemInfo{" +
                "section=" + section +
                ", courseName='" + courseName + '\'' +
                ", localUrl='" + localUrl + '\'' +
                '}';
    }
}
  • MapMapper实现
import android.content.Intent;

import java.io.Serializable;
import java.util.Map;

/**
 * Created by yongjie on 2017/1/5.
 */

public class MapWrapper<T extends Map & Serializable> implements Serializable {

    private final T map;

    public MapWrapper(T map) {
        this.map = map;
    }

    public T getMap() {
        return map;
    }

    public static <T extends Map & Serializable> Intent
    putMapExtra(Intent intent, String name, T map) {

        return intent.putExtra(name, new MapWrapper<>(map));
    }

    public static <T extends Map & Serializable> T
    getMapExtra(Intent intent, String name)
            throws ClassCastException {

        Serializable s = intent.getSerializableExtra(name);
        return s == null ? null : ((MapWrapper<T>) s).getMap();
    }

测试方法

 public void startActivity(Map<Integer, CourseItemInfo> courseItemInfoMap) {
        Intent intent = new Intent(context, TransparentActivity.class);
        MapWrapper.putMapExtra(intent, "mapWrapper", courseItemInfoMap);
        startActivity(intent);
    }

public void getActivity(){
        Map<Integer, CourseItemInfo> courseItemInfoMap = MapWrapper.getMapExtra(getIntent(), "mapWrapper");
    }
  • ListMapper实现
import android.content.Intent;

import java.io.Serializable;
import java.util.List;

/**
 * Created by yongjie on 2017/1/5.
 */

public class ListWrapper<T extends List & Serializable> implements Serializable {

    private final T list;

    public ListWrapper(T list) {
        this.list = list;
    }

    public T getList() {
        return list;
    }

    public static <T extends List & Serializable> Intent
    putListExtra(Intent intent, String name, T list) {

        return intent.putExtra(name, new ListWrapper<>(list));
    }

    public static <T extends List & Serializable> T
    getListExtra(Intent intent, String name)
            throws ClassCastException {

        Serializable s = intent.getSerializableExtra(name);
        return s == null ? null : ((ListWrapper<T>) s).getList();
    }
}
  • 测试方法
 public void startActivity(Map<Integer, CourseItemInfo> courseItemInfo) {
        Intent intent = new Intent(context, TransparentActivity.class);
        ListWrapper.putListExtra(intent, "listWrapper", courseItemInfo);
        startActivity(intent);
    }

public void getActivity(){
        List<CourseItemInfo> courseItemInfo = ListWrapper.getListExtra(getIntent(), "listWrapper");
    }

有更好的解决方法欢迎讨论
喜欢摄影的小伙伴可以来这个网站看看哟:视觉摄影

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值