2013-09-25 11 views
8

Ich habe erfolgreich ein Retrofit API REST-Client macht beide GET & POST Anrufe und auch aufgenommen, dass in Robospice als Hintergrunddienst.Robospice/Retrofit Hintergrunddienst Zugriff auf Datenbank

Allerdings möchte ich die Robospice Dienst an der Datenbank verbinden und beharren asynchron die abgerufenen Objekte aus dem GET Anruf. Mit Hilfe der RetrofitCallback Klasse scheint die offensichtliche Art und Weise, aber die Verbindung zur Datenbank erfordert Context und I "m besorgt über die Context undicht.

so, was den besten Ansatz wäre, den RobospiceSpiceService anhalten Daten zu erhalten in die Datenbank vor und Post verarbeitet, um eine Anfrage zu werden?

Antwort

2

Am Ende, als ich den verschiedenen Erholung API Service Dosieren bin ruft Radio (Reto Meier Dev Bytes: Efficient Data Transfers) zu speichern, rufe ich den Rest API-Dienste (RetrofitSpiceService s) von innerhalb eines Controllers Robospice SpiceService enthält sowohl die Referenz auf die DatabaseHelper (erfordert Context) und die entsprechenden Retrofit Rückrufe für die Rest Dienste.

Auf diese Weise übernimmt der Controller-Dienst die alle Triggerung (AlarmManager löst den Controller-Dienst) und persistierende auf DB und die Dienste Ruhe selbst ohne Kenntnis der context, database oder dergleichen als normal herunterfahren.

Für @ lion789:
Ich habe 4 Modelle jeweils mit einem entsprechenden API-Aufruf mit dem Server zu synchronisieren (1 POST, 3 GET).
Um diese Synchronisierungsanrufe zu behandeln, habe ich eine IntentService, die 4 SpiceManager Attribut und 4 RetrofitCallback Klassen enthält - eine für jedes Modell/API-Aufruf.
Die IntentService ist eine Enum übergeben, die eine Sequenz von APIs angibt, die aufgerufen werden sollten.
Die IntentService ruft das entsprechende SpiceManager auf, das ausgeführt wird, dann löst die Callback die Persistenz aus und ruft eine IntentService-Methode auf, um den nächsten API-Aufruf in der Sequenz auszulösen.

Ein Los davon ist abstrahiert und Schnittstelle wie ich es für meine Auth und Push-Registrierung Code verwenden, so ist es ein bisschen ein Alptraum zu beschreiben, aber es funktioniert bisher ziemlich gut.

+0

Hey Haben Sie ein Beispiel dafür haben ... Ich bin eigentlich auch versuchen Robospice zu verwenden, um die Daten mit Retrofit zwischenzuspeichern – Lion789

+1

Edited meine Antwort mehr Informationen bereitzustellen, um @ Lion789. Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen. – saywhatnow

+0

danke, war eigentlich neugierig, wenn ich OkHttpClient habe und nachrüst, passiert das Caching automatisch, was bedeutet, dass ich Robospice dann nicht benutzen muss? – Lion789

2

Ihre Frage ist wirklich unscharf für mich. Ich verstehe nicht, warum Sie den normalen Persistenzmechanismus von RS nicht verwenden können. Wenn Sie dies tun, ist es ziemlich einfach, Ihre Daten beizubehalten, wenn Anfragen ausgeführt wurden.

Vielleicht vermisse ich etwas. Also, wenn Ihre Anforderung ist, Daten persistent zu halten, dann sieht der Ansatz, den Sie vorschlagen, richtig aus. Sie könnten den Spice-Service selbst in Ihre Anfrage einfügen (siehe zum Beispiel, wie addRequest in RetrofitSpiceService überschrieben wird).Die Anfrage würde dann einen Kontext enthalten, der für die Persistenz innerhalb eines Callbacks oder innerhalb der Anfrage selbst verwendet werden kann.

Kürzlich habe ich eine POST-Anfrage mit Retrofit und RS codiert. Ich habe die Signatur der POST-Anfrage geändert, um eine Leere zurückzugeben. Dann leicht modifiziert den Retrofit-Konverter, um mit diesem Fall umzugehen und null zurück zu geben. Die Anfrage erhielt wie zuvor erwähnt den Spice-Service via Injektion und könnte einige Aktionen in der Datenbank durchführen.

Hier ist ein Code, um die Anwendung innerhalb einer Anfrage innerhalb eines Gewürzdienstes zu injizieren.

@Override 
    public void addRequest(CachedSpiceRequest<?> request, 
        Set<RequestListener<?>> listRequestListener) { 
      if (request.getSpiceRequest() instanceof MySpiceRequest) { 
        MySpiceRequest<?> mySpiceRequest = (MySpiceRequest<?>) request 
            .getSpiceRequest(); 
        mySpiceRequest.setApplication(this.getApplication()); 
      } 
      super.addRequest(request, listRequestListener); 
    }