实现可序列化的对象非常有用,因为它可以传递一个intent的附加内容:
Intent intent = new Intent(this, SomeActivity.class);
intent.putExtra("key", someObject);
startActivity(intent);
然后在其他活动中获取它:
MyObjectUsinGeoPoint Object = (MyObjectUsinGeoPoint) getIntent().getSerializableExtra("key");
问题是,我收到了这个错误:
Caused by: java.io.NotSerializableException: com.google.firebase.firestore.GeoPoint
我尝试通过在模型中创建内部类来使GeoPoint
实现Serializable
:
private class GeoBetter extends GeoPoint implements Serializable {
public GeoBetter(double v, double v1) {
super(v, v1);
}
}
然后在构造函数中初始化它:
public MyObjectUsinGeoPoint(double latitude, double longitude) {
geoPoint = new GeoBetter(latitude, longitude);
}
但我得到了另一个错误:
Caused by: java.io.InvalidClassException: com.domain.tupas.models.MyObjectUsinGeoPoint$GeoBetter; no valid constructor
如何为包含不可序列化的Object的Intent添加额外内容?
答案 0 :(得分:3)
你可以尝试下面的方法:
private GeoPoint location;
@Override
public void writeToParcel(Parcel parcel, int i)
{
parcel.writeDouble(location.getLatitude());
parcel.writeDouble(location.getLongitude());
}
public UserModel(Parcel in)
{
Double lat = in.readDouble();
Double lng = in.readDouble();
location = new GeoPoint(lat, lng);
}
如果类不太复杂(如GeoPoint),它可以工作,否则你需要找到不同的方法。
答案 1 :(得分:0)
您可以通过将android.location.Location
对象发送为Parcelable
来实现相同目标,因为位置对象已实现Parcelable
接口
然后在另一个活动中,您可以从intent获取位置对象并构造一个新的com.google.firebase.firestore.GeoPoint
对象并将其设置为您自己的模型
像这个简单的例子: -
1-首先获取位置对象并将其作为Parcelable extra传递给intent
@Override
public void onLocationChanged(Location location) {
Intent intent = new Intent(context,AnotherActivity.class);
intent.putExtra("extraLocation",location);
context.startActivity(intent);
}
或者您可以创建位置对象并手动为其提供纬度和经度
Location location = new Location(LocationManager.GPS_PROVIDER); // any provider
location.reset();
location.setLatitude(latitude);
location.setLongitude(longitude);
2-在另一个活动中从Intent extra
获取位置对象Location location = getIntent().getParcelableExtra("extraLocation");
GeoPoint geoPoint = geoPointFromLocation(location);
3-这是将位置对象转换为GeoPoint的简单方法
private GeoPoint geoPointFromLocation(Location location) {
GeoPoint geoPoint = new GeoPoint(location.getLatitude(),location.getLongitude());
return geoPoint ;
}
最后,您可以在模型中设置GeoPoint对象。