在for循环中观察livedata

2019年5月19日 21点热度 0条评论

我想在我的活动中更新一个列表,该列表取决于另一个列表的数据。从my viewmodel的活动中正在观察这两个数据列表。从第一个列表中获取数据后,我需要在此列表上运行for循环以获取所需的ID并获取第二个列表的数据。

但是将livedata观察器保留在for循环中会引起很多问题。 for循环按预期运行,但是livedata观察器被调用的次数几乎是for循环的两倍。仅在从api导入列表时才发生这种情况。当我第二次执行相同的操作并缓存列表并将其从数据库中带出时,不会发生此问题。以下是该问题的源代码,

for (int i = 0; i < firstList.size(); i++) {

    final String uId = firstList.get(i).item.uid;
    final long id = firstList.get(i).item.id;
    viewModel.initAnotherItemRepository(uId, id);
    viewModel.getSecondItem().observe(this, new Observer<Resource<List<SecondItem>>>() {
        @Override
        public void onChanged(Resource<List<SecondItem>> listResource) {
            if (listResource.data != null) {
                secondItemList.addAll(listResource.data);
                if (count == firstList.size() - 1) {
                    //Do something

                }
                count = count + 1;
            }
            if (listResource.state == Resource.STATE_FAILURE) {
                showLoadingSpinner(false);
            }
        }
    }

    );
}

解决方案如下:

尝试观察for循环外的SecondItem。每当更新时都会获取数据

viewModel.getSecondItem().observe(this, new Observer<Resource<List<SecondItem>>>() {
    @Override
    public void onChanged(Resource<List<SecondItem>> listResource) {
        if (listResource.data != null) {
            secondItemList.addAll(listResource.data);
            if (count == firstList.size() - 1) {
                //Do something

            }
            count = count + 1;
        }
        if (listResource.state == Resource.STATE_FAILURE) {
            showLoadingSpinner(false);
        }
    }
}

);

for (int i = 0; i < firstList.size(); i++) {

    final String uId = firstList.get(i).item.uid;
    final long id = firstList.get(i).item.id;
    viewModel.initAnotherItemRepository(uId, id);
}