2017-10-20 29 views
1

objets qui met en oeuvre sérialisable sont très utiles car peut être passer dans les extras de l'intention:Firestore comment objet putExtra utilisant Geopoint

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

Et puis l'obtenir dans l'autre activité:

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

Le problème est, je reçois cette erreur:

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

J'essaie de faire GeoPoint EXÉCUTIO nts Serializable en créant une classe interne dans mon modèle:

private class GeoBetter extends GeoPoint implements Serializable { 

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

puis l'initialiser dans le constructeur:

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

Mais je suis arrivé cette autre erreur:

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

Comment puis-je mettre un supplément pour une intention qui contient un objet qui n'est pas sérialisable?

Répondre

0

Vous pouvez essayer l'approche ci-dessous:

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

Il fonctionne si la classe est pas trop complexe (comme GeoPoint), sinon vous devez trouver une approche différente.

+0

On dirait que ça pourrait marcher, pouvez-vous partager la classe complète et quelques exemples? – cutiko

+0

C'est parti: https://gist.github.com/adityahas/7729153e522e2c6d184aa641d070aef1 De quel exemple avez-vous besoin en particulier? –

+0

Eh bien, ce modèle semble explicite, je vais l'essayer et vous faire savoir, s'il vous plaît soyez patient, je suis actuellement sur un autre projet – cutiko

0

vous pouvez atteindre un même but en envoyant android.location.Location objet comme Parcelable supplémentaire depuis l'objet de l'emplacement mettent déjà en oeuvre l'interface Parcelable

puis dans une autre activité, vous pouvez obtenir l'objet de l'emplacement de l'intention et constract un nouvel objet com.google.firebase.firestore.GeoPoint et le mettre à votre modèle comme cet exemple simple: -

1- d'abord obtenir l'objet de l'emplacement et le transmettre comme Parcelable supplémentaire pour intention

@Override 
public void onLocationChanged(Location location) { 

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

ou vous pouvez créer un objet de l'emplacement et lui donner la latitude et la longitude manuellement

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

2- dans une autre activité obtenir l'objet de l'emplacement d'une intention supplémentaire

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

3- ceci est une méthode simple pour convertir l'objet d'emplacement à GeoPoint

private GeoPoint geoPointFromLocation(Location location) { 

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

et enfin vous pouvez définir l'objet GeoPoint dans votre modèle.

+0

Pourquoi cela fonctionnerait-il, comme dans mon cas, il y aurait un champ Geopoint à l'intérieur de l'objet qui est passé dans l'intention, l'avez-vous testé? – cutiko

+0

Si vous faites du champ GeoPoint comme transitoire vous pouvez éviter l'exception mais le champ est nul après l'avoir obtenu, une solution de contournement transmet l'emplacement à l'intention, puisque les deux contiennent les mêmes données, j'espère que l'équipe firebase alors nous pouvons le passer facilement avec l'intention – aboodrak

+0

Mec!Je suis littéralement anxieux d'obtenir une version avec des requêtes Geo – cutiko