2011-11-02 8 views
5

Więc w zasadzie przeszedłem tym tutorialu http://mindtherobot.com/blog/37/android-architecture-tutorial-developing-an-app-with-a-background-service-using-ipc/Parcelable napotkał IOException pisanie zaszeregować obiekt

Bo to jest mniej więcej to, co chcę osiągnąć. Chcę, aby moja usługa GPS działała w tle, stale zbierając współrzędne GPS i zapisując je w tablicy, w ten sposób użytkownik może zamienić się na inną czynność i wrócić do działania Mapy, a następnie wyznaczyć najbardziej swoją całą zarejestrowaną ścieżkę.

Przeprowadziłem ten samouczek, aby skonfigurować IPC i wygląda na to, że działa on mniej lub więcej, ale mam problem z odzyskaniem danych z mojej aktywności. Oto moje pliki, pierwszy to mój obiekt Parcelable, który jest listą, która będzie przechowywać GPSObject. Dalej są moje GPSObject, które są tylko serializowalnym obiektem zawierającym niektóre informacje z obiektu lokalizacji Androida.

package com.android.SnowFever; 

import java.util.ArrayList; 
import java.util.List; 

import com.android.SnowFever.*; 
import com.google.android.maps.GeoPoint; 

import android.os.Parcel; 
import android.os.Parcelable; 

public final class GPSResult implements Parcelable { 

public static final Creator<GPSResult> CREATOR = new Creator<GPSResult>() { 
    @Override 
    public GPSResult[] newArray(int size) { 
     return new GPSResult[size]; 
    } 

    @Override 
    public GPSResult createFromParcel(Parcel source) { 
     return new GPSResult(source); 
    } 
}; 

private List<GPSObject> geoPoints; 

public GPSResult() { 
    geoPoints = new ArrayList<GPSObject>(); 
} 

@SuppressWarnings("unchecked") 
private GPSResult(Parcel source) { 
    geoPoints = source.readArrayList(GPSService.class.getClassLoader()); 
} 

public void addGPS(GPSObject location) { 
    geoPoints.add(location); 
} 

public List<GPSObject> getGeoPoints() { 
    return geoPoints; 
} 

@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeList(geoPoints); 
} 

} 

A to moja klasa GPSObject

package com.android.SnowFever; 

import java.io.Serializable; 

import com.google.android.maps.GeoPoint; 

import android.location.Location; 

public class GPSObject implements Serializable{ 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

float spd, acc; 
double lat, lng, alt; 
GeoPoint gp; 

public GPSObject(Location l) { 
    lat = l.getLatitude() * 1E6; 
    lng = l.getLongitude() * 1E6; 
    alt = l.getAltitude(); 
    spd = l.getSpeed(); 
    acc = l.getAccuracy(); 
    gp = new GeoPoint((int)lat,(int)lng); 
} 

} 

Aby dodać pliki do mojej listy GPSResult zgłoszę

latestGPSResult.getGeoPoints().add(new GPSObject(location)); 

i pojawia się błąd zawarty w temacie wątku, większy kawałek okna błędu poniżej:

11-01 18:49:06.818: E/JavaBinder(20754): *** Uncaught remote exception! (Exceptions are not yet supported across processes.) 
11-01 18:49:06.818: E/JavaBinder(20754): java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.android.SnowFever.GPSObject) 
11-01 18:49:06.818: E/JavaBinder(20754): at android.os.Parcel.writeSerializable(Parcel.java:1176) 
11-01 18:49:06.818: E/JavaBinder(20754): at android.os.Parcel.writeValue(Parcel.java:1130) 
11-01 18:49:06.818: E/JavaBinder(20754): at android.os.Parcel.writeList(Parcel.java:519) 
11-01 18:49:06.818: E/JavaBinder(20754): at com.android.SnowFever.GPSResult.writeToParcel(GPSResult.java:52) 
11-01 18:49:06.818: E/JavaBinder(20754): at com.android.SnowFever.GPSApi$Stub.onTransact(GPSApi.java:52) 
11-01 18:49:06.818: E/JavaBinder(20754): at android.os.Binder.execTransact(Binder.java:320) 
11-01 18:49:06.818: E/JavaBinder(20754): at android.os.BinderProxy.transact(Native Method) 
11-01 18:49:06.818: E/JavaBinder(20754): at com.android.SnowFever.GPSListener$Stub$Proxy.handleGPSUpdated(GPSListener.java:76) 
11-01 18:49:06.818: E/JavaBinder(20754): at com.android.SnowFever.GPSService$GeoUpdateHandler.onLocationChanged(GPSService.java:91) 

Odpowiedz

4

Oznacza to, że obiekt com.android.SnowFever.GPSObject nie podlega przekształceniu do postaci szeregowej. Przypuszczam, że GeoPoint nie można przekształcać do postaci szeregowej. Oznacza to, że musisz wdrożyć writeObject i readObject.

2

Myślę, że Twoim problemem jest to, że GeoPoint nie jest obiektem podlegającym Serializacji. Miałem ten sam problem i to dlatego, że miałem Uri w mojej klasie, która implementowała interfejs Serializable.

1

W przypadku złożonych obiektów, które są przekształcane do postaci szeregowej, konieczne jest przekształcenie do postaci szeregowej każdego obiektu, dopóki wszystko, co pozostało, nie jest prymitywne. W twoim przypadku musisz wykreślić lub napisać klasę kontenera dla GeoPoint, która pozwoli przekazać ją wokół twojej aplikacji.

1

Tak jak powiedział Ciprian, geoPoints jest listą (interfejsem), której nie można przekształcić do postaci szeregowej. Zmień go na ArrayList - upewnij się, że gdy ustawisz jego wartość, otrzymasz listę ArrayList, a nie List - nie używaj interfejsu, ponieważ parser nie będzie wiedział, do czego ma to zrobić.

2

Upewnij się, że wszystkie zagnieżdżone klasy używane przez strukturę, którą próbujesz serializować, są (rekursywnie) szeregowalne.

Powiązane problemy