Niedawno omawiam architekturę Androida, która została niedawno wprowadzona przez google. Z Documentation Znalazłem to:Jak zaktualizować LiveData obiektu ViewModel z usługi w tle i Aktualizuj interfejs użytkownika
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
}
}
działalność może uzyskać dostęp do tej listy, co następuje:
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
});
}
}
Moje pytanie brzmi, w funkcji loadUsers()
ja ściągam dane asynchronicznie, gdzie najpierw sprawdzi baza danych (pokój) dla tych danych, jeśli nie dostanę tam danych, wykonam wywołanie API, aby pobrać dane z serwera WWW. Następnie wstawię pobrane dane do bazy danych (Room) i zaktualizuję interfejs użytkownika zgodnie z danymi. Jakie jest zalecane podejście do tego?
jeśli rozpocznę Service
zadzwonić API z metody loadUsers()
, w jaki sposób mogę zaktualizować MutableLiveData<List<User>> users
zmienną z tego Service
?
Przede wszystkim brakuje repozytorium. Twój ViewModel nie powinien wykonywać żadnych zadań ładowania danych. Poza tym, ponieważ używasz pokoju, Twoja usługa nie musi aktualizować LiveData bezpośrednio w ViewModel. Serwis może jedynie wstawiać dane do pokoju, a dane ViewModelData powinny być dołączane tylko do pokoju, a także otrzymywać aktualizacje z pokoju (po wstawieniu danych usługi). Ale dla absolutnie najlepszej architektury spójrz na implementację klasy NetworkBoundResource od dołu tej strony: https://developer.android.com/topic/libraries/architecture/guide.html –
dziękuję za sugestię :) – CodeCameo
Klasa repozytoriów nie jest wspomniany w dokumentach opisujących POKÓJ lub elementy architektury Androida – jonney