Parcelable遇到IOException编写可序列化对象

时间:2011-11-02 02:03:39

标签: android

所以基本上我经历了这个教程 http://mindtherobot.com/blog/37/android-architecture-tutorial-developing-an-app-with-a-background-service-using-ipc/

因为它或多或少是我想要实现的目标。我希望我的GPS服务在后台运行,不断收集GPS坐标并将它们保存到数组中,这样用户可以交换到另一个活动并返回到Map活动并使其仍然绘制最多的整个记录​​路径。

所以我实现了这个教程来设置IPC,它似乎或多或少有效,但我在将数据恢复到我的Activity时遇到了问题。这是我的文件,首先是我的Parcelable对象,它是一个包含GPSObject的列表。接下来是我的GPSObject,它只是一个可序列化的对象,包含来自Android Location对象的一些信息。

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);
}

}

这是我的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);
}

}

要将文件添加到我的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)

5 个答案:

答案 0 :(得分:4)

这意味着com.android.SnowFever.GPSObject对象不可序列化。我想GeoPoint不可序列化。这意味着您必须实施writeObjectreadObject

答案 1 :(得分:2)

我认为您的问题是GeoPoint不是Serializable对象。我遇到了同样的问题,因为我的Class中有一个Uri正在实现Serializable接口。

答案 2 :(得分:2)

像Ciprian所说,geoPoints是一个不可序列化的List(接口)。将它更改为ArrayList - 确保在设置它的值时给它一个ArrayList而不是List - 不要使用该接口,因为解析器不知道将序列化为什么。

答案 3 :(得分:2)

确保您尝试序列化的结构使用的所有嵌套类都是(递归地)可序列化的。

答案 4 :(得分:1)

对于序列化的复杂对象,您需要序列化每个对象,直到剩下的所有对象为基元。 在您的情况下,您必须为GeoPoint抽象或编写容器类,以允许将其传递给您的应用程序。