2011-10-20 38 views
0

我正在开发简单的旅行社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。

回答

1

我的理解是,你不应该使用Parcels。从Android的文档Parcels

包裹不是一个通用的序列化机制。该类(以及用于将任意对象放入Parcel的相应Parcelable API)被设计为高性能IPC传输。因此,将任何Parcel数据放入持久性存储中是不恰当的:Parcel中任何数据的底层实现中的更改都会导致旧数据无法读取。

你应该做的是为每一个你想转移到下一个活动的类创建两个静态方法。打电话给其中一人toBundle(),其中一人fromBundle()。第一个将您类的给定实例转换为一个包,而第二个类从包中创建您的类的新实例。每次您需要将对象传递给下一个活动时,只需使用toBundle()方法将其绑定即可,并将其添加到您用于启动下一活动的Intent中。在下一个活动中,您可以通过调用fromBundle()来重新创建该对象。

+0

谢谢。我可以解决解组问题。错误的是,在读取的包裹函数中,我没有为Lis​​t和Map类型创建对象,我必须创建。这解决了这个问题。使用parcelable/bundle方法,如果我们有一个100个自定义对象的列表,那么写入捆绑/包裹和从捆绑包/宗地中读取将花费很高。所以为了避免这个问题,我将UserSession的元素设为静态,这可以避免额外的副本,但我不知道这种方法会受到惩罚。 – Srinivas

+0

我不认为有这样做的其他干净的方式。基本上保持数据在静态中传递与编组类似,并使您可以完全控制其状态。 – blacharnia