2017-10-20 177 views
1
putExtra对象实现Serializable

对象是非常有用的,因为可以通过在意图的演员:公司的FireStore如何使用的GeoPoint

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 impleme NTS 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 

我怎么能为包含不可序列化的对象的Intent额外添加?

回答

0

您可以尝试波纹管的方法:

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的),否则,你需要找到不同的方法。

+0

似乎它可以工作,你能分享完整的课程和几个例子吗? – cutiko

+0

这里你去:https://gist.github.com/adityahas/7729153e522e2c6d184aa641d070aef1 你特别需要什么样的例子? –

+0

那么模型似乎是自我解释,我会尝试它,让你知道,请耐心等待,我目前在其他项目 – cutiko

0

您可以通过发送android.location.Location对象Parcelable额外实现同样的目标,因为位置的对象已经实现Parcelable接口

然后在另一个活动,你可以从意向获取位置对象和建设工程新com.google.firebase.firestore.GeoPoint对象,并将其设置为自己的模型 像这样简单的例子: -

1首先获取位置对象,并把它作为Parcelable额外给意图

@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 - 从意向额外获得位置对象

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对象。

+0

为什么会这样工作,就像在我的情况下,在Intent中传递Object的内部会有Geopoint字段,你测试了它吗? – cutiko

+0

如果您将GeoPoint字段设置为瞬态,则可以避免该异常,但是在您从意图获得该字段后该字段为空,解决方法是将该位置传递给intent,因为两者都保存相同的数据,所以希望Firebase团队使GeoPoint实现可分区界面所以然后我们可以很容易地通过它意图 – aboodrak

+0

伙计!我真的很担心通过地理查询获得版本 – cutiko