我正在开发简单的旅行社android应用程序。当应用程序启动时会加载城市列表,在下一个活动中,用户将看到源代码和目标代码,当用户选择适当的源代码和目标代码后,它将执行第三个活动,如果用户选择了第四个活动哪个用户选择座位并继续订票。为了保持完整的用户会话我维持UserSession类,它是如下(除去在代码不必要的逻辑是不相关的问题)Android用户对象parcelable问题
public class UserSession implements Parcelable {
List<City> citiesList;
HashMap<String, City> cityMap; // Map city name to code
RouteSearchResult searchedRoutes;
String sourceCity;
String destinationCity;
LocalStop selectedBoardingPoint;
LocalStop selectedArrivalPoint;
@Override
public void writeToParcel(Parcel parcel, int flags) {
try {
parcel.writeList(citiesList);
parcel.writeMap(cityMap);
parcel.writeValue(searchedRoutes);
parcel.writeString(sourceCity);
parcel.writeString(destinationCity);
parcel.writeValue(selectedBoardingPoint);
parcel.writeValue(selectedArrivalPoint);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class City implements Parcelable {
String cityName;
String cityId;
@Override
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeString(cityName);
parcel.writeString(cityId);
}
}
public class RouteSearchResult {
City source;
City destination;
String date;
List<RouteDetails> routeDetails;
}
我有以下问题 1)我正在运行在写
W/System.err( 817): java.lang.RuntimeException: Parcel: unable to marshal value [email protected]
W/System.err( 817): at android.os.Parcel.writeValue(Parcel.java:1132)
W/System.err( 817): at android.os.Parcel.writeList(Parcel.java:519)
W/System.err( 817): at com.travelagent.UserSession.writeToParcel(UserSession.java:201)
W/System.err( 817): at android.os.Parcel.writeParcelable(Parcel.java:1151)
2)我评论parcel.writeList(citiesList);
语句来看看,如果我得到任何更多的问题时例外,我得到了类似的问题,parcel.writeValue(searchedRoutes);
我有以下questio ns, 1)如何将自定义对象列表为parcelable? 2)是否需要制作像City
这样的自定义类也是可以分类的,这是要分类的实际类的一部分。 3)有没有解决这类问题的方法,如将用户会话传递给所有活动。
请帮忙,我搜索了,但我找不到合适的解决方案,使自定义类可parcelable。
谢谢。我可以解决解组问题。错误的是,在读取的包裹函数中,我没有为List和Map类型创建对象,我必须创建。这解决了这个问题。使用parcelable/bundle方法,如果我们有一个100个自定义对象的列表,那么写入捆绑/包裹和从捆绑包/宗地中读取将花费很高。所以为了避免这个问题,我将UserSession的元素设为静态,这可以避免额外的副本,但我不知道这种方法会受到惩罚。 – Srinivas
我不认为有这样做的其他干净的方式。基本上保持数据在静态中传递与编组类似,并使您可以完全控制其状态。 – blacharnia