2017-05-28 4 views
0

Ich versuche, Daten, die vom Retrofit-Service empfangen werden, in eine Singleton-Klasse zu mappen. Es scheint, weil getInstance() statische Methode nicht aufgerufen wird, wenn Retrofit JSON auf mein Objekt mappt, INSTANCE Variable ist nicht initialisiert und das nächste Mal, wenn ich MyClass.getInstance() aufrufen bekomme ich Objekt mit Standardwerten und nicht, was ich von Retrofit erhalten. Wie gehe ich vor, um Daten aus dem Retrofit in die Singleton-Klasse zu speichern.Nachrüsten von JSON-Zuordnung zu Singleton-Klasse

P.S. Ich brauche das, weil ich das gleiche Objekt verwenden muss, das ich im ersten Fragment-Modell erhalten habe, im zweiten Fragment in ViewPager.

Meine Singletonklasse:

public final MySingletonClass { 

    //pirivate final fields; 

    private MySingletonClass() { 
     //default initialization fields 
    } 


    public static MySingletonClass getInstance() { 
     return MySingletonClassSingletonHelper.INSTANCE; 
    } 

    private static class MySingletonClassSingletonHelper { 
     private static final MySingletonClass INSTANCE = new MySingletonClass(); 
    } 

    //getters 

} 

OK, wenn jemand wissen müssen, wie ich Nachrüstung verwenden:

@Override 
public Observable<MySingletonClass> loadData(Integer params) { 
    return mRetrofitInterface.getMySingletonClass(params).subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()); 
} 


public interface MySingletonClassService { 
@POST("some address") 
Observable<MySingletonClass> getMySingletonClass(@Path("idd") Integer idd); 
} 
+0

Wollen Sie Ihre Daten über mehrere Läufe Ihrer Anwendung anhalten oder über nur einen Lauf? – Sac

+0

Nur einzelne Ausführung. Bis zur nächsten Anfrage an die gleiche Adresse (Refresh). – Sermilion

Antwort

1

Ich glaube nicht, dass dies die beste Option ist, aber man könnte es tun:

public final MySingletonClass { 

    //private final fields; 

    private MyRetrofitObject foo; 

    private MySingletonClass() { 
     //default initialization fields 
    } 


    public static MySingletonClass getInstance() { 
     return MySingletonClassSingletonHelper.INSTANCE; 
    } 

    private static class MySingletonClassSingletonHelper { 
     private static final MySingletonClass INSTANCE = new MySingletonClass(); 
    } 

    //getters 

    public void setObject(MyRetrofitObject foo) { 
     this.foo = foo; 
    } 

} 

Wenn Sie das Objekt aus Retrofit zurückgeben, setzen Sie es auf Ihrem Singleton.

INSTANCE.setObject(fooFromRetrofit); 

Dieses trennt Objekt Parsen von in Speicher

+0

Das dachte ich auch, aber ich hoffte, dass Retrofit selbst mit Singleton-Mappings umgehen kann. Ich denke, das ist so gut wie es geht. – Sermilion

+1

ehrlich gesagt ist das besser als das, was Sie denken https://en.wikipedia.org/wiki/Single_responsibility_principle – Blundell

+0

Meinst du mit separaten Objekten, die empfangenen Daten und Objekt darstellt, das Objekt darstellt, das als Singleton von diesem Objekt verwendet wird? Ich kann das sehen, ich muss möglicherweise das Objekt ändern, das ich als Singleton benutze, und dies hat keinen Einfluss auf mein Objekt, um empfangene Daten darzustellen. Versteh ich dich richtig? – Sermilion

Verwandte Themen