如何停止接收来自livedata observe Room的等待答案



我正在处理一些我根本不理解的事情。

如果我在更新我的房间数据库之前删除了观察者,然后重新打开观察者,我会收到每次更新的通知,并且recyclerview会更新多次。

我的部分代码:

public class ArticlesListFragment extends Fragment {
private LiveData<List<Article>> mLDgetAllArticle;
private long mClistId;
private ArrayList<Article> mArticles;
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
this.mLDgetAllArticle = this.articleViewModel.getAllArticle(mclistId);
this.setArticlesObserver();
...
}
private void setArticlesObserver() {
if (this.mLDgetAllArticle != null && !this.mLDgetAllArticle.hasObservers())
this.mLDgetAllArticle.observe(getViewLifecycleOwner(), this::updateArticlesList);
}
private void updateArticlesList(List<Article> articles) {
this.mArticles = new ArrayList<>(articles);
this.mArticlesRecyclerViewAdapter.setAdapterDatas(this.mArticles);
}
private void removeArticlesObserver() {
if (this.mLDgetAllArticle != null && this.mLDgetAllArticle.hasObservers())
this.mLDgetAllArticle.removeObservers(getViewLifecycleOwner());
}
private void updateArticle(Article article) {
this.articleViewModel.updateArticle(article);
}
...
}

到目前为止一切都很好。

但是,在其他地方,我必须更新我所有的文章,比如:

for (int i = 0; i < this.mArticles.size(); i++) {
this.mArticles.get(i).setOrd(i);
this.updateArticle(this.mArticles.get(i));
}

此外,我认为我应该删除之前的观察者,稍后再放回:

this.removeArticlesObserver();
for (int i = 0; i < this.mArticles.size(); i++) {
this.mArticles.get(i).setOrd(i);
this.updateArticle(this.mArticles.get(i));
}
this.setArticlesObserver();

但我仍然会收到所有更新后的通知。在setArticlesObserver之后,updateArticlesList被调用的次数与updateArticles一样多。

我错过了什么?

在再次设置观察者之前,有没有办法清除所有等待的结果?

ViewModelFactory.java:

public class ViewModelFactory implements ViewModelProvider.Factory {
private final ArticleDataRepository articleDataSource;

private final Executor executor;
private static volatile ViewModelFactory factory;
public static ViewModelFactory getInstance(Context context) {
if (factory == null) {
synchronized (ViewModelFactory.class) {
if (factory == null) {
factory = new ViewModelFactory(context);
}
}
}
return factory;
}
private ViewModelFactory(Context context) {
getDB database = getDB.getInstance(context);
this.articleDataSource = new ArticleDataRepository(database.articleDao());
this.executor = Executors.newSingleThreadExecutor();
}
@Override
@NotNull
public <T extends ViewModel>  T create(Class<T> modelClass) {
if (modelClass.isAssignableFrom(ArticleViewModel.class)) {
return (T) new ArticleViewModel(articleDataSource, executor);
}
throw new IllegalArgumentException("Unknown ViewModel class");
}
}

ArticleViewModel.java:

public class ArticleViewModel extends ViewModel {
private final ArticleDataRepository articleDataSource;
private final Executor executor;
public ArticleViewModel(
ArticleDataRepository articleDataSource,
Executor executor
) {
this.articleDataSource = articleDataSource;
this.executor = executor;
}
public LiveData<List<Article>> getAllArticle(long clistId) {
return articleDataSource.getAll(clistId);
}
}

文章数据存储库:

public class ArticleDataRepository {
private final ArticleDao articleDao;
public ArticleDataRepository(ArticleDao articleDao) {
this.articleDao = articleDao;
}
public LiveData<List<Article>> getAll(long clistId) {
return this.articleDao.getAll(clistId);
}
}

我使用了这份文件

我采取了两个步骤来解决我的问题:

  1. 我正在更新所有的文章,而不是做第一部分我不知道我可以做

    @更新(onConflict=OnConflictStrategy.REPLACE(void updateAll(ArrayList文章(;

    对于(int i=0;i<this.mArticles.size((;i++({this.mArticles.get(i(.setOrd(i(;this.updateArticle(this.mArticles.get(i((;}

变为:

for (int i = 0; i < this.mArticles.size(); i++) {
this.mArticles.get(i).setOrd(i);
}
this.updateAllArticles(this.mArticles);
  1. 我设置了一个标志,仅在特定事件期间启动notifyDataSetChanged(),而不是每次更新数据时

最新更新