2011-10-20 7 views
0

私は簡単な旅行代理店アンドロイドアプリケーションを開発しています。アプリケーションが起動すると、都市のリストがロードされ、次のアクティビティではソースとデスティネーションのスピナーが表示され、適切なソースとデスティネーションが選択されると3番目のアクティビティ、4番目のアクティビティどのユーザが座席を選択してチケットを予約し続けるかを示す。完全なユーザーセッションを維持するために、私は)私は、次のような問題 1を持っている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; 
    } 

をUserSessionクラスを維持し、次のようである(問題とは無関係であるコード内の不要なロジックを削除)しています私は実行を取得しています時間例外私はこれ以上の問題を取得するかどうかを確認するためにparcel.writeList(citiesList);文をコメント)

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を書き​​ながら、私はquestioを以下しているparcel.writeValue(searchedRoutes);

と同様の問題を抱えてns、 1)カスタムオブジェクトのリストをパーセル可能にするにはどうすればよいですか? 2)Cityのようなカスタムクラスをパーセル化する必要があります。これはパーセル化する実際のクラスの一部です。 3)ユーザーセッションをすべてのアクティビティに渡すなど、この種の問題を解決する方法はありますか。

助けてください、私は検索しましたが、私はカスタムクラスをparcelableにする適切な解決策を見つけることができませんでした。

答えて

1

私はこのために小包を使用しないことを理解しています。 Parcelsのアンドロイドのドキュメントから:

パーセルは汎用シリアル化メカニズムではありません。このクラス(および任意のオブジェクトをParcelに配置するための対応するParcelable API)は、高性能IPCトランスポートとして設計されています。そのため、Parcelデータを永続ストレージに配置することは適切ではありません。Parcel内のデータの基礎となる実装を変更すると、古いデータが判読不可能になる可能性があります。

あなたがすべきことは、次のアクティビティに転送するクラスごとに2つの静的メソッドを作成することです。そのうちの1つをtoBundle()とし、そのうちの1つをfromBundle()と呼んでください。最初のインスタンスはクラスのインスタンスをバンドルに変換し、2番目のインスタンスはバンドルからクラスの新しいインスタンスを作成します。オブジェクトを次のアクティビティに渡す必要があるたびに、toBundle()メソッドを使用してオブジェクトをバンドルし、それを使用しているインテントに追加して、次のアクティビティを開始します。次のアクティビティでは、fromBundle()を呼び出してオブジェクトを再作成できます。

+0

ありがとうございます。私は非マーシャル問題を解決することができました。間違いは、読み込みパーセル関数で、ListとMapの型のオブジェクトを作成しなかったため、作成する必要があります。これで問題は解決しました。パーセル可能/バンドル手法では、100個のカスタムオブジェクトのリストがあると、バンドル/パーセルに書き込み、バンドル/パーセルから読み込むのにコストがかかるでしょう。この問題を避けるために、私はUserSessionの要素を静的にしました。これは追加のコピーを避けることができますが、このアプローチのペナルティは分かりません。 – Srinivas

+0

私はこれを行う他のクリーンな方法はないと思います。基本的に静的に渡すデータを整理するのは、整列化に似ており、状態を完全に制御できます。 – blacharnia