2011-10-20 40 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