2016-08-17 1 views
0

Ich habe eine Schnittstelle namens PlacesDataSource, um eine Liste der Orte zu erhalten. Es hat eine Methode namens Place getPlaces().Verwenden des Data Access Object Patterns mit Retrofit

Ich habe zwei Klassen, die diese Schnittstelle implementieren, eine, die Plätze von einer lokalen Datenbank bekommt, eine geht online und macht Netzwerkanfragen.

Für die lokale Umsetzung, die ich habe:

List<Place> getPlaces() { 
    return mDatabase.getThoseGoodPlaces(); 
} 

Für die Online-Umsetzung, die ich habe:

List<Place> getPlaces() { 
    Response<List<Place>> response = myOnlineApi.getThoseGoodPlaces().execute(); // synchronous request 
    return response.body() 
} 

Doch diese NetworkOnMainThreadException verursachen würde. Ich kann die Interface-Methode zu void getPlaces() ändern, um eine asynchrone Anforderung zu verwenden. Aber das sieht nicht richtig aus.

Wie definiert man normalerweise die Schnittstelle, implementiert eine lokale und eine Online-Version davon, wenn das Data Access Object-Muster verwendet wird?

+0

Ich weiß nicht, wie man es richtig aussehen lässt, aber der Zugriff auf die db vom UI-Thread sieht auch nicht richtig aus – lelloman

Antwort

0

Benutze Schnittstelle Observable> getPlaces() wo Observable <> von rxJava ist. Retrofit holt Daten aus REST und übergibt sie an die .onSubscribe() - Methode dieses Obervable. Für db ruft wrap db Aufrufe in dieselbe Methode auf. Dann können Sie Daten aus dem Internet aktualisieren, sie in db speichern und das Ergebnis in einer Kette von Operatoren zurückgeben.