2017-10-20 5 views
1

Objekte, die serializable sind sehr nützlich implementiert, weil in den Extras einer Absicht passieren kann:Firestor, wie man putExtra Objekt mit Geopunkt

Intent intent = new Intent(this, SomeActivity.class); 
intent.putExtra("key", someObject); 
startActivity(intent); 

Und dann in der anderen Aktivität erhalten:

MyObjectUsinGeoPoint Object = (MyObjectUsinGeoPoint) getIntent().getSerializableExtra("key"); 

Das Problem ist, ich bin immer diese Fehlermeldung:

Caused by: java.io.NotSerializableException: com.google.firebase.firestore.GeoPoint 

ich versuche GeoPoint DURCHFÜHRU zu machen nts Serializable durch eine innere Klasse in meinem Modell zu erstellen:

private class GeoBetter extends GeoPoint implements Serializable { 

    public GeoBetter(double v, double v1) { 
     super(v, v1); 
    } 
} 

und initialisieren es dann im Konstruktor:

public MyObjectUsinGeoPoint(double latitude, double longitude) { 
    geoPoint = new GeoBetter(latitude, longitude); 
} 

Aber ich habe diese anderen Fehler:

Caused by: java.io.InvalidClassException: com.domain.tupas.models.MyObjectUsinGeoPoint$GeoBetter; no valid constructor 

Wie kann ich ein Extra für eine Absicht hinzufügen, die ein Objekt enthält, das nicht serialisierbar ist?

Antwort

0

Sie können unten Ansatz versuchen:

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

Es funktioniert, wenn die Klasse nicht zu komplex ist (wie GeoPoint), sonst müssen Sie anderen Ansatz finden.

+0

Scheint, wie es funktionieren könnte, können Sie die komplette Klasse und ein paar Beispiele teilen? – cutiko

+0

Hier gehts: https://gist.github.com/adityahas/7729153e522e2c6d184aa641d070aef1 Welches Beispiel brauchst du besonders? –

+0

Nun, dieses Modell scheint selbsterklärend, ich werde es versuchen und lassen Sie es wissen, bitte haben Sie Geduld, ich bin derzeit auf anderen Projekt – cutiko

0

können Sie gleiche Ziel erreichen, indem android.location.Location Objekt als Parcelable zusätzliche Senden seit Standort Objekt bereits Parcelable Schnittstelle können Sie von Vorsatz Objekt erhalten Lage

dann in einer anderen Aktivität implementieren und constract ein neues com.google.firebase.firestore.GeoPoint Objekt und stellen Sie Ihre eigene Modell wie dieses einfache Beispiel: -

1- zuerst die Lage Objekt erhalten und es als Parcel Vorsatz zusätzliche passieren

@Override 
public void onLocationChanged(Location location) { 

    Intent intent = new Intent(context,AnotherActivity.class); 
    intent.putExtra("extraLocation",location); 
    context.startActivity(intent); 
} 

oder Sie können Standort-Objekt erstellen, und geben Sie ihm geografische Breite und Länge manuell

Location location = new Location(LocationManager.GPS_PROVIDER); // any provider 
location.reset(); 
location.setLatitude(latitude); 
location.setLongitude(longitude); 

2- in einer anderen Tätigkeit erhalten die Lage Objekt aus Intent Extra

Location location = getIntent().getParcelableExtra("extraLocation"); 
GeoPoint geoPoint = geoPointFromLocation(location); 

3- dies ist eine einfache Methode zur Umwandlung Das Positionsobjekt zu GeoPoint

private GeoPoint geoPointFromLocation(Location location) { 

     GeoPoint geoPoint = new GeoPoint(location.getLatitude(),location.getLongitude()); 
     return geoPoint ; 
    } 

und schließlich können Sie das GeoPoint-Objekt in Ihrem Modell festlegen.

+0

Warum würde das funktionieren, wie in meinem Fall würde es Geopoint-Feld innerhalb des Objekts in der Absicht bestanden haben, haben Sie es getestet? – cutiko

+0

Wenn Sie GeoPoint-Feld als transient machen, können Sie die Ausnahme vermeiden, aber das Feld null sein, nachdem Sie es von Absicht erhalten haben, eine Problemumgehung gibt den Standort an Absicht weiter, da beide dieselben Daten enthalten. Ich hoffe, dass das Firebase-Team GeoPoint die parcelable-Schnittstelle implementiert so können wir es leicht mit Absicht weitergeben – aboodrak

+0

Alter!Ich bin buchstäblich besorgt über eine Freigabe mit Geo-Abfragen – cutiko

Verwandte Themen