How to update LiveData of a ViewModel from background service and Update UI How to update LiveData of a ViewModel from background service and Update UI android android

How to update LiveData of a ViewModel from background service and Update UI


I am assuming that you are using android architecture components. Actually it doesn't matter wherever you are calling service, asynctask or handler to update the data. You can insert the data from the service or from the asynctask using postValue(..) method. Your class would look like this:

private void loadUsers() {    // do async operation to fetch users and use postValue() method    users.postValue(listOfData)}

As the users is LiveData, Room database is responsible for providing users data wherever it is inserted.

Note: In MVVM like architecture, the repository is mostly responsible for checking and pulling local data and remote data.


You can use MutableLiveData<T>.postValue(T value) method from background thread.

private void loadUsers() {    // do async operation to fetch users and use postValue() method   users.postValue(listOfData)}


... in the loadUsers() function I am fetching the data asynchronously ... If I start a Service to call the API from the loadUsers() method, how can I update the MutableLiveData> users variable from that Service?

If the app is fetching user data on a background thread, postValue (rather than setValue) will be useful.

In the loadData method there is a reference to the MutableLiveData "users" object. The loadData method also fetches some fresh user data from somewhere (for example, a repository).

Now, if execution is on a background thread, MutableLiveData.postValue() updates outside observers of the MutableLiveData object.

Maybe something like this:

private MutableLiveData<List<User>> users;...private void loadUsers() {    // do async operation to fetch users    ExecutorService service =  Executors.newSingleThreadExecutor();    service.submit(new Runnable() {        @Override        public void run() {            // on background thread, obtain a fresh list of users            List<String> freshUserList = aRepositorySomewhere.getUsers();            // now that you have the fresh user data in freshUserList,             // make it available to outside observers of the "users"             // MutableLiveData object            users.postValue(freshUserList);                }    });}