私は簡単な旅行代理店アンドロイドアプリケーションを開発しています。アプリケーションが起動すると、都市のリストがロードされ、次のアクティビティではソースとデスティネーションのスピナーが表示され、適切なソースとデスティネーションが選択されると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にする適切な解決策を見つけることができませんでした。
ありがとうございます。私は非マーシャル問題を解決することができました。間違いは、読み込みパーセル関数で、ListとMapの型のオブジェクトを作成しなかったため、作成する必要があります。これで問題は解決しました。パーセル可能/バンドル手法では、100個のカスタムオブジェクトのリストがあると、バンドル/パーセルに書き込み、バンドル/パーセルから読み込むのにコストがかかるでしょう。この問題を避けるために、私はUserSessionの要素を静的にしました。これは追加のコピーを避けることができますが、このアプローチのペナルティは分かりません。 – Srinivas
私はこれを行う他のクリーンな方法はないと思います。基本的に静的に渡すデータを整理するのは、整列化に似ており、状態を完全に制御できます。 – blacharnia