2011-10-20 2 views
0

나는 간단한 여행사 안드로이드 응용 프로그램을 개발하고 있습니다. 응용 프로그램이 시작되면 다음 도시 활동 목록에서 도시 목록을로드합니다. 사용자는 소스 및 대상 스피너를 볼 수 있습니다. 사용자가 적절한 소스 및 대상을 선택하면 세 번째 활동으로 이동하고 사용자가 네 번째 활동을 선택하면 사용 가능한 여행을 표시합니다. 어떤 사용자가 좌석을 선택하고 티켓을 계속 예약합니다. 완전한 사용자 세션을 유지하기 위해 나는 다음과 같이안드로이드 사용자 객체 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) 나는 실행을 얻고있다 (문제에 관련이 코드에서 불필요한 로직을 제거)하는 사용자 세션 클래스를 유지하고있다 시간 예외 내가 더 이상 문제를 얻을 수 있는지 확인하기 위해 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) 모든 활동에 사용자 세션을 전달하는 것과 같은 문제를 해결할 수있는 방법이 있습니까?

도와주세요. 검색해 보았지만 사용자 지정 클래스를 구분할 수있는 적절한 솔루션을 찾을 수 없습니다.

답변

1

내 이해는 소포를 사용해서는 안된다는 것입니다. 안드로이드 설명서에서 Parcels :

Parcel은 범용 직렬화 메커니즘이 아닙니다. 이 클래스 (및 임의의 객체를 Parcel에 배치하기위한 해당 Parcelable API)는 고성능 IPC 전송으로 설계되었습니다. 따라서 Parcel 데이터를 영구 저장소에 저장하는 것은 적절하지 않습니다. Parcel에있는 데이터의 기본 구현을 변경하면 이전 데이터를 읽을 수 없게 될 수 있습니다.

다음 작업으로 전송할 각 클래스에 대해 두 가지 정적 메서드를 만들어야합니다. 그들 중 하나를 toBundle()이라고하고 그 중 하나를 fromBundle()으로 부릅니다. 첫 번째 클래스는 주어진 클래스 인스턴스를 번들로 변환하고 두 번째 클래스는 번들에서 클래스의 새 인스턴스를 만듭니다. 다음 활동으로 객체를 전달해야 할 때마다 toBundle() 메소드를 사용하여 묶어서 다음 활동을 시작하는 데 사용중인 인 텐트에 추가하십시오. 다음 활동에서는 fromBundle()을 호출하여 개체를 다시 만들 수 있습니다.

+0

감사합니다. 나는 비 정렬 화 문제를 풀 수 있었다. 실수는 읽기 소포 함수에서 List 및 Map 유형의 객체를 만들지 않아 작성해야합니다. 이 문제가 해결되었습니다. parcelable/bundle 방식을 사용하면 100 개의 사용자 정의 객체 목록이 있으면 번들/소포에 쓰고 번들/소포에서 읽는 데 많은 비용이 듭니다. 그래서이 문제를 피하기 위해 UserSession의 요소를 정적으로 만들었습니다. 이것은 추가 사본을 피할 수는 있지만이 접근법의 페널티는 알지 못합니다. – Srinivas

+0

나는 이것을하는 다른 깨끗한 방법이 없다고 생각합니다. 기본적으로 통계에서 전달할 데이터를 유지하는 것은 마샬링과 유사하며 상태를 완전히 제어 할 수 있습니다. – blacharnia