【问题标题】:Live data observer getting called even after observer is remoevd即使在观察者被移除后也会调用实时数据观察者
【发布时间】:2019-07-22 14:11:17
【问题描述】:

我有一个活动,它实例化一个片段 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()
    }
}

这是道查询:

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

users 表有许多字段,例如 name 、 phonenumber 、 status 、 location 等。 我继续从后台更新表格。 我希望我的片段加载一次数据,当我删除观察者时,它不应该得到任何数据库更改的更新。 但问题是第一次,当我加载片段时,数据被加载到列表中,dataChanged 被调用。并且观察者被移除。

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

【问题讨论】:

    标签: android android-livedata


    【解决方案1】:

    为什么要观察两次列表?

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

    您可以通过dataChanged 方法将您的列表提交给适配器。

    【讨论】:

    • 我第二次观察实时数据,获取 onCHanged 回调,根据实时数据列表中的项目数设置我的屏幕标题。并且还删除了观察者。如您所见,上面粘贴的代码
    • 我尝试在 dataChanged 中添加 submitList ,但没有成功。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多