观察者在活动中被两次调用

问题描述

在下面的代码中,将所有用户从参数存储到结果arraylist之后,多次调用我的观察者。我是新来观察模式的人,所以不确定在这里做错了什么。

   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
}

解决方法

我假设您多次拨打from emp e join dept d on d.deptno = e.deptno where e.job = 'SALESMAN' and d.loc = 'LONDON' 。当您调用popoulateResults()时,将其传递给searchResultsViewModel.getUserById(it).observe()的新实例,因此每次调用观察者时,都会执行观察者内部的代码。一个简单的解决方法应该是将观察者定义为像这样的函数之外的属性

Observer

并像使用它

val observer = Observer { your code }