2016-07-13 66 views
0

In Android-Anwendung habe ich Speicherproblem während der Durchführung von gson.toJson(). Ich tue folgenden Schritte aus:gson.toJson() gibt Speicher Probleme mit Realm

  1. die Benutzerdetails Abrufen von Realm-Datenbank Benutzerklasse
  2. Sie dann die Benutzerklasse Werte wie Namen aktualisieren, Telefonnummer
  3. Umwandlung in String-Darstellung unter Verwendung von gson.toJson()

Diesmal gibt es mir Speicherfehler. Die Benutzerklasse hat auch eine Beziehung mit der Entitätsklasse ImageDetails und LocationDetails.

Fehler: "Hintergrund klebrig gleichzeitige Markierung sweep"

+0

bekommen Können Sie freundlich Ihre Klasse schreiben .. – Debu

+0

wahrscheinlich dieses Thema werden Ihnen helfen, - http://stackoverflow.com/questions/34735639/retrofit-realmlist-gson-stuck-in-a-loop-until-out-of-memory – Debu

+0

@Debu Ich versuchte bereits die Lösung gegeben den Link, den Sie zur Verfügung gestellt, aber kein Glück . Benötigen Sie den Entity-Klassencode? –

Antwort

0

Hier ist, wie ich das Problem gelöst

  1. Fügen Sie die folgende Zeile in der build.gradle (Projekt) -

    Klassenpfad "io.realm: realm-gradle-plugin: 1.1.0"

  2. Fügen Sie die folgende Zeile in build.grad hinzu le (app) -

    gelten Plugin: 'Reich-android'

Die obigen 2 Zeilen wird die neueste Version von Realm in Ihr Projekt aufzunehmen.

  1. Verwenden Sie den Code unten Json obj auf Zeichenfolge zu konvertieren -

         Gson gson = new GsonBuilder() 
            .setExclusionStrategies(new ExclusionStrategy() { 
             @Override 
             public boolean shouldSkipField(FieldAttributes f) { 
              return f.getDeclaringClass().equals(RealmObject.class); 
             } 
    
             @Override 
             public boolean shouldSkipClass(Class<?> clazz) { 
              return false; 
             } 
            }) 
            .registerTypeAdapter(Class.forName("com.wandertrails.realm.UserDetails"), new UserDetailsSerilizer()) 
            .create(); 
            Log.e("Json Value",gson.toJson(new UserDetails())); 
    

ändern com.wandertrails.realm.UserDetails zu Ihrem Klassennamen

  1. erstellen JsonSerializer Klasse die Klasse manuell serialisiert -

    public class UserDetailsSerilizer implements JsonSerializer<UserDetails> { 
    @Override 
    public JsonElement serialize(UserDetails src, Type typeOfSrc, JsonSerializationContext context) { 
        final JsonObject jsonObject = new JsonObject(); 
        jsonObject.addProperty("dob",src.getDob()); 
        jsonObject.addProperty("emailAddress",src.getEmailAddress()); 
        jsonObject.addProperty("gender",src.getGender()); 
        jsonObject.addProperty("id",src.getId()); 
        return jsonObject; 
    }} 
    
+0

In Ihrem Vorschlag erstellen Sie JsonObject. Stattdessen kann ich die String-Repräsentation des Objekts, das ich über Realm aktualisiert habe, nicht direkt erzeugen. Ist das eine Einschränkung von Realm? –

+0

Realm erlaubt nur Getter und Setter in der Klasse zu schreiben, die RealmObject erweitert, bitte akzeptieren Sie die Antwort, wenn es Ihnen hilft .. – Debu

0

Eine andere Lösung ist mit einer RawUser Klasse, die nicht RealmObject erstreckt und Gson.toJson auf dieser neuen Klasse. Sie können eine getRawUser Methode in Ihrer Realm Benutzerklasse hinzufügen und dann nur noch

gson.toJson(user.getRawUser()); 

schreiben Ihr serialisierte Objekt