【问题标题】:Android user object parcelable issueAndroid用户对象可打包问题
【发布时间】:2011-10-20 20:19:10
【问题描述】:

我正在开发简单的旅行社安卓应用程序。当应用程序启动时,它会加载城市列表,在下一个活动中,用户将看到源和目的地微调器,一旦用户选择了正确的源和目的地,它将进入第三个活动,如果用户选择一个,它会显示可用的旅行,它需要到第四个活动哪个用户选择座位并继续订票。为了维护完整的用户会话,我维护了一个 UserSession 类,如下(删除代码中与问题无关的不必要的逻辑)

    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 com.travelagent.City@40605878
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); 类似的问题

我有以下问题, 1) 如何将自定义对象列表设为可打包? 2) 是否必须让City 等自定义类也可打包,这是要打包的实际类的一部分。 3) 是否有任何方法可以解决此类问题,例如将用户会话传递给所有活动。

请帮忙,我搜索了,但我找不到合适的解决方案来使自定义类可打包。

【问题讨论】:

    标签: android


    【解决方案1】:

    我的理解是,您不应该为此使用 Parcels。来自Parcels上的android文档:

    Parcel 不是通用的序列化机制。此类(以及用于将任意对象放入 Parcel 的相应 Parcelable API)被设计为高性能 IPC 传输。因此,将任何 Parcel 数据放入持久存储是不合适的:Parcel 中任何数据的底层实现发生变化都可能导致旧数据不可读。

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

    【讨论】:

    • 谢谢。我可以解决解组问题。错误是,在读取包裹函数中,我没有为 List 和 Map 类型创建对象,我必须创建。这解决了问题。使用 parcelable/bundle 方法,如果我们有 100 个自定义对象的列表,这将使写入 bundle/parcel 和从 bundle/parcel 读取的成本很高。所以为了避免这个问题,我将 UserSession 的元素设为静态,这样可以避免额外的副本,但我不知道这种方法的惩罚。
    • 我认为没有其他干净的方法可以做到这一点。基本上保持数据在静态中传递类似于编组,并让您完全控制它们的状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 2014-10-30
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    相关资源
    最近更新 更多