Search code examples
androidkotlinandroid-activityviewmodelobserver-pattern

observer gets called twice inside activity


In below code my observer gets called multiple time after storing all users from arguments to result arraylist. I am new to observe pattern so I am not sure what I am doing wrong here.

   private lateinit var usersObserver: Observer<List<User?>?>

   override fun onCreate(savedInstanceState: Bundle?) {
    usersObservar = Observer {
     userResults = populateResults(it)
   }
  }

  private fun populateResults(users: List<User?>): MutableList<UserModel> {
    val results: MutableList<UserModel> = ArrayList()
    for (user in users) {
        //Ignore potential null predictions
        if ((user != null) &&user.isUserNotNull()) {

           user.id?.let {
                searchResultsViewModel.getUserById(it).observe(
                    this,
                    Observer { ud ->
                        if (ud  != null && ud.hasNonNullLatLngOffsetMembers()) {
                           results.add(
                               UserModel(
                                    name = user.placeId!!,
                                    address = ud.address
                                    displayed = false
                                )
                            )
                        }
                        
                    }
                )
            }
        }
    }

    return results
}

Solution

  • I assume you are calling popoulateResults() multiple times. When you call searchResultsViewModel.getUserById(it).observe() you pass it a new instance of the Observer therefore everytime the observer is called the code inside the observer is getting executed. An easy fix should be defining the observer as a property outside the function like this

    val observer = Observer { your code }
    

    and use it like

    searchResultsViewModel.getUserById(it).observe(this, observer)