2016-09-20 6 views
2

Ich versuche gerade, eine App zu erstellen, die Ihnen eine Position auf einer Karte anzeigt und sie gleichzeitig in Firebase zur späteren Verwendung speichert.StackoverflowError bei der Verwendung von Firebase

Das ist mein MapsActivity ist:

public class MapsActivity extends AppCompatActivity 
     implements OnMapReadyCallback, 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener, LocationListener { 

    GoogleMap googleMap; 
    LocationRequest mLocationRequest; 
    GoogleApiClient mGoogleApiClient; 
    Marker marker; 
    Intent intent; 
    DatabaseReference myRef; 
    FirebaseDatabase database; 
    Longlat longlat; 
    private static final String TAG ="PvCOS"; 

    @Override 
    protected void onCreate (Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_maps); 
     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 

     intent = getIntent(); 
     buildGoogleApiClient(); 
     mGoogleApiClient.connect(); 
     database = FirebaseDatabase.getInstance(); 
     myRef = database.getReference(); 

    } 

    //class to be sent to db 
    public class Longlat { 

     public double longitude; 
     public double latitude; 

     public Longlat() { 
      // Default constructor required for calls to DataSnapshot.getValue(longlat.class) 
     } 

     public Longlat(Double longitude, Double latitude) { 
      this.longitude = longitude; 
      this.latitude = latitude; 
     } 

    } 

    protected synchronized void buildGoogleApiClient() { 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
    } 

    @Override 
    public void onMapReady(GoogleMap map) { 

     googleMap = map; 
     setUpMap(); 
    } 

    public void setUpMap() { 
     try { 
      googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
      googleMap.setMyLocationEnabled(true); 
      googleMap.getUiSettings().setZoomControlsEnabled(true); 
     } catch (SecurityException se){ 
      // TODO: 20/09/2016 handle exception 
     } 
    } 

    @Override 
    public void onConnected(Bundle bundle) { 
     try { 
      mLocationRequest = new LocationRequest(); 
      mLocationRequest.setInterval(10); 
      mLocationRequest.setFastestInterval(10); 
      mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 

      LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,  mLocationRequest, this); 
     } catch (SecurityException se){ 
      // TODO: 20/09/2016 handle exception 
     } 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 

    } 

    @Override 
    public void onLocationChanged(Location location) { 

     //save to server 
     longlat = new  Longlat(location.getLongitude(),location.getLatitude()); 
     myRef.child("users").child(intent.getStringExtra("name")).setValue(longlat); 
     LatLng latLng = new LatLng(location.getLatitude(),  location.getLongitude()); 
     marker = googleMap.addMarker(new MarkerOptions() 
       .position(latLng) 
       .title(intent.getStringExtra("name")) 
       .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED))); 

    } 


    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 

    } 
    protected void onStop() { 
     //unregister location updates 
     LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 

     //remove previously placed Marker 
     if (marker != null) { 
      marker.remove(); 
     } 
     super.onStop(); 
    } 

} 

Wenn ich es laufen, bekomme ich einen weißen Bildschirm und diesen Fehler in logcat:

09-20 13:18:25.206 21875-21875/grp6.PvCOS E/UncaughtException: java.lang.StackOverflowError: stack size 8MB 
at  java.lang.reflect.Method.invoke(Native Method) 
at  com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzbw(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzcd(Unknown Source) 
at  com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzbw(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzcd(Unknown Source) 
at  com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzbw(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzcd(Unknown Source) 
at  com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzbw(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzcd(Unknown Source) 
at  com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzbw(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzcd(Unknown Source) 
at  com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzbw(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzcd(Unknown Source) 
at  com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzbw(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzcd(Unknown Source) 
at  com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzbw(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzcd(Unknown Source) 
at  com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzbw(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzcd(Unknown Source) 
at  com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzbw(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzcd(Unknown Source) 
at  com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzbw(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzcd(Unknown Source) 
at  com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzbw(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzcd(Unknown Source) 
at  com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzbw(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzcd(Unknown Source) 
at  com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzbw(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzcd(Unknown Source) 
at  com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzbw(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzcd(Unknown Source) 
at  com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzbw(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzcd(Unknown Source) 
at  com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzbw(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzcd(Unknown Source) 
at  com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzbw(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzcd(Unknown Source) 
at  com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzbw(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzcd(Unknown Source) 
at  com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzbw(Unknown Source) 
at  com.google.android.gms.internal.zzaln.zzcd(Unknown Source) 
at  com.google.android.gms.internal.zzaln$zza.zzce(Unknown Source) 
at  com.google.android.gms.inter   

Ziemlich sicher, dass es das Firebase Teil, der den Fehler verursacht, als ich einen anderen Thread über jemanden fand, der versuchte, ein Bild über Firebase zu senden, das zu groß war, aber alles, was ich sende, ist ein einfaches Objekt.

+0

Eine andere Ursache für den StackOverflowError beim Aufrufen von setValue() für mich, für andere sah dies, versuchte ein POJO mit einer Reihe von Eigenschaften zu speichern, die nicht wirklich POJO-Eigenschaften waren, wodurch ein riesiges Objektdiagramm gespeichert wurde der POJO. – Eliot

Antwort

0

Ich hatte gerade missverstanden, wie Sie neue Kinder in Firebase erstellen. ich versuchte, sie mit .child hinzufügen

 myRef = database.getReference("PvCOS/users"); 

myRef.child ("Benutzer") Kind (intent.getStringExtra ("name")) setValue (longlat)..;

Aber ich sollte nur die Kinder hinzugefügt haben, als meine Referenz-:

 myRef = database.getReference("PvCOS/users"+name); 
     myRef.setValue(longlat); 
+0

verwenden, aber mit 'push()' ist genug, um ein neues Kind zu erstellen –

+0

das hat mein Problem nicht gelöst. Siehe meine Frage http://StackOverflow.com/q/40317713/3671509 –

1

Sie müssen auf den Knoten des JSON-Baums im Firebase verweisen. Bitte überprüfen Sie diesen Code.

FirebaseDatabase database = FirebaseDatabase.getInstance(); 
DatabaseReference myRef = database.getReference("PvCOS/users"); 
+0

meine JSON Baum ist { "PvCOS": { "Benutzer": { "frede": { "lat": 123, "long": 123 } } } } Was soll ich Schreiben Sie in der Referenz, wenn ich neue Kinder für Benutzer erstellen möchte – fredeaf

+0

Ich habe aktualisiert mycode, überprüfen Sie es –

+0

wurde nicht den Fehler los – fredeaf

0

ich das gleiche Problem erlebt haben: Stackoverflow Ausnahme bei dem Versuch, mein Objekt mit savevalue Methode zu speichern.

Aber in meinem Fall war das Problem nicht wegen der falschen Referenz, sondern wegen der Verwendung von Androids Uri-Objekt als ein Feld meiner Klasse. Firebase kann sie nicht speichern, also musste ich sie durch String ersetzen.

Verwandte Themen