Kürzlich beschäftige ich mich mit Android-Architektur, die kürzlich von Google eingeführt wurde. Aus der Dokumentation habe ich folgendes gefunden:
public class MyViewModel extends ViewModel {
private MutableLiveData<List<User>> users;
public LiveData<List<User>> getUsers() {
if (users == null) {
users = new MutableLiveData<List<Users>>();
loadUsers();
}
return users;
}
private void loadUsers() {
// do async operation to fetch users
}
}
Die Aktivität kann wie folgt auf diese Liste zugreifen:
public class MyActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
model.getUsers().observe(this, users -> {
// update UI
});
}
}
Meine Frage ist, ich werde dies tun:
In der
loadUsers()
Funktion rufe ich die Daten asynchron ab, wobei ich zuerst die Datenbank (Raum) auf diese Daten überprüfeWenn ich die Daten dort nicht erhalte, werde ich einen API-Aufruf durchführen, um die Daten vom Webserver abzurufen.
Ich werde die abgerufenen Daten in die Datenbank (Raum) einfügen und die Benutzeroberfläche entsprechend den Daten aktualisieren.
Was ist der empfohlene Ansatz, um dies zu tun?
Wie kann ich die Variable von dort aktualisieren, wenn ich a starte Service
, um die API über die loadUsers()
Methode aufzurufen ?MutableLiveData<List<User>> users
Service
loadUsers()
ruft im Grunde das Repo auf, um die Benutzerinformationen zu erhaltenAntworten:
Ich gehe davon aus, dass Sie Android-Architekturkomponenten verwenden . Eigentlich spielt es keine Rolle, wo immer Sie anrufen
service, asynctask or handler
, um die Daten zu aktualisieren. Sie können die Daten aus dem Dienst oder aus der Asynctask mithilfe derpostValue(..)
Methode einfügen . Ihre Klasse würde so aussehen:Da das
users
istLiveData
,Room
ist Datenbank verantwortlich für die Datennutzer überall dort , wo es eingesetzt wird.Note:
In einer MVVM-ähnlichen Architektur ist das Repository hauptsächlich für das Überprüfen und Abrufen lokaler Daten und entfernter Daten verantwortlich.quelle
LiveData
users.postValue(mUsers);
-> Kann die postValue-Methode von MutableLiveData LiveData akzeptieren?value
anstelle vonpostValue
. Danke für deine Antwort.Sie können die
MutableLiveData<T>.postValue(T value)
Methode aus dem Hintergrundthread verwenden.quelle
.setValue()
nicht erlaubt wäreWenn die App Benutzerdaten in einem Hintergrundthread abruft , ist postValue (anstelle von setValue ) hilfreich.
In der loadData-Methode gibt es einen Verweis auf das MutableLiveData-Objekt "users". Die loadData-Methode ruft auch einige neue Benutzerdaten von irgendwoher ab (z. B. aus einem Repository).
Wenn sich die Ausführung in einem Hintergrundthread befindet, wird MutableLiveData.postValue () außerhalb der Beobachter des MutableLiveData-Objekts aktualisiert.
Vielleicht so etwas:
quelle
getUsers()
Methode ruft möglicherweise eine API für die asynchronen Daten auf (startet möglicherweise einen Dienst oder eine Asynctask dafür). Wie kann sie in diesem Fall die Liste von ihrer return-Anweisung zurückgeben?Schauen Sie sich den Android-Architekturleitfaden an , der die neuen Architekturmodule wie
LiveData
und begleitetViewModel
. Sie diskutieren genau dieses Thema ausführlich.In ihren Beispielen stellen sie es nicht in einen Dienst. Schauen Sie sich an, wie sie es mit einem "Repository" -Modul und Retrofit lösen. Die Addendums unten enthalten vollständigere Beispiele, einschließlich der Übermittlung des Netzwerkstatus, der Meldung von Fehlern usw.
quelle
Wenn Sie Ihre API im Repository aufrufen, dann
Im Repository :
In ViewModel
In Aktivität / Fragment
Hinweis: Wenn Sie hier JAVA_1.8 Lambda verwenden, können Sie es auch ohne verwenden
quelle