即使删除了观察者,实时数据观察者也会被召唤

时间:2019-07-22 14:11:17

标签: android android-livedata

我有一个活动,该活动将片段B实例化。片段B显示了一个用户列表。我从DB作为LiveData获取。我向实时数据添加了一个观察者。每当调用onChanged时,我都会删除观察者。 但是无论何时数据库更改,onChanged都会被反复调用。

这是片段类的代码:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    initRecyclerViews()
    viewModel.liveResult = viewModel.getAllUsers()
    observeData()
}
fun observeData() {
        viewModel.liveResults?.observe(this@UserFragment, Observer(allUserAdapter::submitList))
        viewModel.liveResults?.observe(this@UserFragment, observer)
    }
val observer: Observer<PagedList<User>> = object : Observer<PagedList<User>> {
    override fun onChanged(t: PagedList<User>?) {
        dataChanged()
    }
}

fun dataChanged() {
    // do some work

    viewModel.liveResults?.removeObservers(this@UserFragment)
}

下面是适配器类的代码:

class AllUsersAdapter(
private val inflater: LayoutInflater) :
    PagedListAdapter<User, MyViewHolder>(diffCallback) {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AllUsersItemViewHolder {
    return MyViewHolder(
            inflater.inflate(R.layout.user_item, parent, false))
}

override fun onBindViewHolder(holder: AllUsersItemViewHolder, position: Int) {
    holder.setItem(getItem(position))
}

companion object {
    private val diffCallback = object : DiffUtil.ItemCallback<User>() {
        override fun areItemsTheSame(oldItem: User, newItem: User): Boolean {
            val ret = oldItem.phonenumber == newItem.phonenumber
            return ret
        }

        override fun areContentsTheSame(oldItem: User, newItem: User): Boolean {
            val ret = oldItem.phonenumber == newItem.phonenumber
            return ret
        }
    }
}

}

这是viewmodel的代码:

    class MyViewModel : BaseViewModel() {
       lateinit var mUsersList: LiveData<PagedList<MaxwellUser>>

fun getAllUsers() {

    val factory = dao.getUsers()
            liveResults = LivePagedListBuilder(factory,
                    PagedList.Config.Builder()
                            .setPageSize(Constant.PAGE_SIZE)
                            .setEnablePlaceholders(true)
                            .build()).build()
    }
}

这是Dao查询:

@Query(Select * from users)
abstract fun getUsers(): DataSource.Factory<Int, User>

users表具有许多字段,例如名称,电话号码,状态,位置等。 我不断从后台更新表格。 我希望我的片段一次加载数据,并且当我删除观察者时,它不应获得数据库更改的任何更新。 但是问题是第一次,当我加载片段时,数据被加载到列表中,dataChanged被调用。观察员被撤职。

但是当某些数据库发生更改时,我的用户列表仍在不断更新。

1 个答案:

答案 0 :(得分:0)

您为什么两次观察列表?

viewModel.liveResults?.observe(this@UserFragment, Observer(allUserAdapter::submitList))
viewModel.liveResults?.observe(this@UserFragment, observer)

您可以使用dataChanged方法将列表提交给适配器。