使用循环中的切换图更新视图模型中的实时数据吗?

时间:2019-08-17 17:25:47

标签: for-loop android-viewmodel switchmap

我有一个视图模型,该模型指向我的Room数据库,并且之间有一个存储库。我想根据它们的ID获取一堆对象,我的存储库指向我的dao,存储库获取字符串列表,然后将我的对象作为实时数据返回给我,一切正常。

现在,我想从循环中执行此操作,因此我将拥有一个列表列表,并且想要为每个列表获取一个对象列表,因此我在视图模型中设置了一个开关映射,并在需要时进行切换我的列表(现在是可变的实时数据)发生了变化,但这仅适用于我设置的最后一个值。

它有效地发挥了作用,(使其等待节流,所以在更改之前等待了半秒钟)是否有人知道是这种情况,以及如何进行操纵以使其在每次更改时触发?

这是我的大多数视图模型

public class SentenceListViewModel extends AndroidViewModel {

private MutableLiveData<List<String>> idsList;
private LiveData<List<Sentence>> sentenceList;
private SentenceRepository sentenceRepository;
private String TAG = "PreviousSentence";


public SentenceListViewModel(@NonNull Application application) {
  super(application);
  sentenceRepository = new SentenceRepository(application);
  sentenceList = new MutableLiveData<>();
  idsList = new MutableLiveData<>();
  sentenceList = Transformations.switchMap(idsList, ids -> 
  sentenceRepository.getLiveCardsByIds(ids));

}

public LiveData<List<Sentence>> getSentenceList() {
  return sentenceList;
}

public void setIdsList(List<String> idsList) {
  this.idsList.setValue(idsList);
}
}

要设置我的视图模型,我有两种方法,一种是设置视图模型,第二种是注册观察者,这两种方法在onCreate中一个接一个地调用

private void setUpSentenceViewModel(){
  sentenceListViewModel = 
  ViewModelProviders.of(this).get(SentenceListViewModel.class);
  sentenceListViewModel.setIdsList(new ArrayList<>());
}

设置观察者-在setUpSentenceViewModel之后调用

private void setUpSentenceViewModelObserver(){
sentenceListViewModel.getSentenceList().observe(this, new 
Observer<List<Sentence>>() {
  @Override
  public void onChanged(List<Sentence> sentences) {
    Log.d(TAG,"onChanged");

    if (sentences != null){

      if (!sentences.isEmpty()){

          Log.d(TAG,"...doStuff");

      }
    }
  }
});
}

设置完这些后,我有一个for循环,可以像这样更新视图模型(idsList)中的句子列表的值

     for (Sentence s : myUser.getSentences()){
          if (s.getSentenceWordType().equals(Constants.SENTENCE)){
            sentenceGroupList.add(new SentenceGroup(s));
            Log.d(TAG,"SET IDS");

            setSentenceViewModelIds(s.getSentences());


          }
        }

setSentenceViewModelIds-

private void setSentenceViewModelIds(List<String> sentenceIds){

  sentenceListViewModel.setIdsList(sentenceIds);
}

这些日志的结果是

onChanged-(这是初始化)

设置ID

设置ID

onChanged

... doStuff

我期望结果是这样的

onChanged-(这是初始化)

设置ID

设置ID

onChanged

... doStuff

onChanged

... doStuff

由于它是异步的,因此可能略有变化

有人对此有任何见识吗?

编辑

打开switchmap的返回lambda并添加一条日志语句(打印“ switch”),表明它已被调用并触发,可能仅仅是更新太快了吗?但是可以肯定的是,它仍然应该将所有结果传递给观察者,不是吗?

新日志

onChanged-(初始化)

设置6个IDS

开关

设置3个IDS

开关

设置3个IDS

开关

设置3个IDS

开关

设置1个IDS

开关

设置2个IDS

开关

onChanged

... doStuff

0 个答案:

没有答案