android开发|Android Intent传递Map及List类型值问题完美解决
问题:
- 在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 implements Serializable {private final T map;
public MapWrapper(T map) {
this.map = map;
}public T getMap() {
return map;
}public static Intent
putMapExtra(Intent intent, String name, T map) {return intent.putExtra(name, new MapWrapper<>(map));
}public static T
getMapExtra(Intent intent, String name)
throws ClassCastException {Serializable s = intent.getSerializableExtra(name);
return s == null ? null : ((MapWrapper) s).getMap();
}
测试方法
public void startActivity(Map courseItemInfoMap) {
Intent intent = new Intent(context, TransparentActivity.class);
MapWrapper.putMapExtra(intent, "mapWrapper", courseItemInfoMap);
startActivity(intent);
}public void getActivity(){
Map 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 implements Serializable {private final T list;
public ListWrapper(T list) {
this.list = list;
}public T getList() {
return list;
}public static Intent
putListExtra(Intent intent, String name, T list) {return intent.putExtra(name, new ListWrapper<>(list));
}public static T
getListExtra(Intent intent, String name)
throws ClassCastException {Serializable s = intent.getSerializableExtra(name);
return s == null ? null : ((ListWrapper) s).getList();
}
}
- 测试方法
public void startActivity(Map courseItemInfo) {
Intent intent = new Intent(context, TransparentActivity.class);
ListWrapper.putListExtra(intent, "listWrapper", courseItemInfo);
startActivity(intent);
}public void getActivity(){
List courseItemInfo = ListWrapper.getListExtra(getIntent(), "listWrapper");
}
【android开发|Android Intent传递Map及List类型值问题完美解决】有更好的解决方法欢迎讨论
喜欢摄影的小伙伴可以来这个网站看看哟:视觉摄影
推荐阅读
- android第三方框架(五)ButterKnife
- 深入理解Go之generate
- Android中的AES加密-下
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 带有Hilt的Android上的依赖注入
- android|android studio中ndk的使用
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)
- Android7.0|Android7.0 第三方应用无法访问私有库
- 深入理解|深入理解 Android 9.0 Crash 机制(二)