2017-10-20 221 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