2016-08-12 2 views
0

Ich bin neu in Android-Entwicklung und derzeit (versuche), eine Anwendung für ein Schulprojekt zu programmieren.Abrufen von Daten nur einmal für zwei Aktivitäten mit Firebase

Ich habe einige Daten in einer Firebase-Datenbank gespeichert, die ich mithilfe der onChildEvent() -Methode abrufen, und ich möchte diese Daten in zwei Aktivitäten verwenden, eine ist eine GoogleMap und die andere ist eine Liste. Mein Problem ist, obwohl ich kein spezielles Problem beim Abrufen der Daten habe, scheint es mir, dass es für die gleichen Daten nicht richtig ist, es zu tun, aber ich kann nicht helfen, die passende Lösung zu finden.

Ich dachte über das Abrufen der Daten in einer der Aktivitäten und die Weitergabe an die anderen mit einer Absicht, aber da die beiden Aktivitäten nicht direkt verknüpft sind (kein Weg und kein Grund, von einem zum anderen zu gehen), ich glaube nicht, dass das eine gute Idee ist.

PS: Englisch ist nicht meine Muttersprache, wenn etwas nicht klar ist, fragen Sie einfach und ich werde mein Bestes tun, um neu zu formulieren;)

+2

Sie einfach Singletonmuster verwenden können –

Antwort

0

Wie @Dima Rostopira sagt, Sie einen Singleton implementieren könnte, welches einmal im Laufe einer Anwendung existiert.

Beispiel mit „Location“ Objekt:

final class LocationModel { 

    private Context mContext; 

    /** List of locations */ 
    private ArrayList<Location> mLocations; 

    /** Static instance of LocationModel, accessible throughout the scope of the applicaton */ 
    private static final LocationModel sLocationModel = new LocationModel(); 

    private LocationModel() {} 

    /** 
    * Returns static instance of LocationModel 
    */ 
    public static LocationModel getLocationModel() { 
     return sLocationModel; 
    } 

    /** 
    * Sets context, allowed once during application 
    */ 
    public void setContext(Context context) { 
     if (mContext != null) { 
      throw new IllegalStateException("context has already been set"); 
     } 
     mContext = context.getApplicationContext(); 
    } 

    /** 
    * Asynchronously loads locations using callback. "forceReload" parameter can be 
    * set to true to force querying Firebase, even if data is already loaded. 
    */ 
    public void getLocations(OnLocationsLoadedCallback callback, boolean forceReload) { 
     if (mLocations != null && !forceReload) { 
      callback.onLocationsLoaded(mLocations); 
     } 
     // make a call to "callback.onLocationsLoaded()" with Locations when query is completed 
    } 

    /** 
    * Callback allowing callers to listen for load completion 
    */ 
    interface OnLocationsLoadedCallback { 
     void onLocationsLoaded(ArrayList<Locations> locations); 
    } 
} 

Verwendung innerhalb einer Aktivität:

MainActivity implements OnLocationsLoadedCallback { 

... 

public void onCreate(Bundle savedInstanceState) { 
    ... 

    LocationModel.getLocationModel().getLocations(this); 

    ... 
} 


@Override 
public void onLocationsLoaded(ArrayList<Locations> location) { 
    // Use loaded locations as needed 
} 
+0

Vielen Dank, es scheint genau das zu sein, was ich war auf der Suche zum ! (und ich kann Ihnen bereits sagen, dass das Beispiel mir viel Zeit gespart hat: D) ​​ – Nap

+0

Pew, ich habe ein Problem mit der Implementierung der Methode getLocations ... Mein Problem ist, wie kann ich wissen, dass meine Anfrage abgeschlossen ist? Da das Hinzufügen von callback.onLocationLoaded (mlocations) nach dem addChildEventListener() effektiv nicht funktioniert ... (Sorry für die dumme Frage, aber ich kann die Antwort nirgends finden ...) – Nap

+0

Und auch, wird diese Lösung funktionieren mit Echtzeitdaten? Da die in meiner Firebase-Datenbank gespeicherten Daten dynamisch sind (Benutzer können sie bearbeiten) und ich möchte Zugriff auf die letzten Informationen haben, wenn ich sie benutze – Nap