Android Parcelable在写入可序列化对象时遇到IOException
基本上我已经完成了这个教程 因为这或多或少是我想要实现的。我希望我的GPS服务在后台运行,不断收集GPS坐标并将其保存到阵列中,这样用户就可以切换到另一个活动并返回到地图活动,并让它仍然绘制出他们整个记录路径的大部分内容 因此,我实施了本教程来设置IPC,它似乎或多或少可以工作,但我在将数据返回到我的活动时遇到了问题。这是我的文件,首先是我的包裹对象,它是一个列表,将保存GPSObject的。接下来是我的GPSObject,它只是一个可序列化的对象,包含来自android位置对象的一些信息Android Parcelable在写入可序列化对象时遇到IOException,android,Android,基本上我已经完成了这个教程 因为这或多或少是我想要实现的。我希望我的GPS服务在后台运行,不断收集GPS坐标并将其保存到阵列中,这样用户就可以切换到另一个活动并返回到地图活动,并让它仍然绘制出他们整个记录路径的大部分内容 因此,我实施了本教程来设置IPC,它似乎或多或少可以工作,但我在将数据返回到我的活动时遇到了问题。这是我的文件,首先是我的包裹对象,它是一个列表,将保存GPSObject的。接下来是我的GPSObject,它只是一个可序列化的对象,包含来自android位置对象的一些信息 p
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);
}
}
要将文件添加到我的GPSResult列表,我调用
latestGPSResult.getGeoPoints().add(new GPSObject(location));
我得到了线程主题中包含的错误,下面错误窗口的一大块
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)
这意味着
com.android.SnowFever.GPSObject
对象不可序列化。我认为地质点
不可序列化。这意味着您必须实现writeObject
和readObject
我认为您的问题是,GeoPoint不是一个可序列化的对象。我也有同样的问题,这是因为我的类中有一个Uri,它正在实现可序列化接口。对于序列化的复杂对象,您需要序列化每个对象,直到剩下的都是原语。
在您的情况下,您必须为GeoPoint抽象或编写一个容器类,以便在应用程序中传递它。正如Ciprian所说,GeoPoint是一个不可序列化的列表(接口)。将其更改为ArrayList-确保在设置其值时为其提供ArrayList而不是列表-不要使用接口,因为解析器不知道将其序列化为什么。确保尝试序列化的结构使用的所有嵌套类都是(递归)可序列化的
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)