android - 完成所有查询(插入/更新/删除)后,是否可以只调用一次观察者?
问题描述
我是房间和实时数据的新手。我的任务是通过服务获取数据并插入房间数据库并通过 livedata 观察者更新 UI,但是每当我执行此任务时,观察者会因为 livedata 更改(插入、更新或删除)而调用 3 次。但实际上我需要的是在完成所有查询(插入/更新/删除)后只调用一次观察者,然后从主线程中删除观察者。请任何人帮助解决
主要片段的观察者初始化:
int updateCount=0; // i don't like to use this count
public void configureViewModel(){
SCREEN_ID=SCREEN_NO_ADDRESS_DETAIL;
viewModel = ViewModelProviders.of(this, viewModelFactory).get(DynamicUIViewModel.class);
viewModel.init(SCREEN_ID,loanType);
Observer observer=new Observer() {
@Override
public void onChanged(@Nullable Object o) {
List<DynamicUITable> list=(List<DynamicUITable>)o;
updateCount++;
if(updateCount==3) {
viewModel.getDynamicUITableLiveData().removeObserver(this); // i want to remove observer without checking this updateCount condition.
updateCount=0;
updateUI(list);
}
}
};
viewModel.getDynamicUITableLiveData().observe(getViewLifecycleOwner(), observer);
}
Repository Class :
public LiveData<List<DynamicUITable>> init(String screenName,String loanType){
try {
refreshData(screenName,loanType);
}catch (Exception ex){
ex.printStackTrace();
}
return dynamicUIDao.load(screenName);
}
Service call method :
private void refreshData(final String screenName,String loanType){
try{
executor.execute(()->{
boolean dataExist = (dynamicUIDao.getTableBasedOnScreen(screenName) != null);
dynamicUIWebservice.getDynamicUIFromServer(screenName).enqueue(new Callback<List<DynamicUITable>>() {
@Override
public void onResponse(Call<List<DynamicUITable>> call, Response<List<DynamicUITable>> response) {
Log.e("TAG", "DATA REFRESHED FROM NETWORK");
executor.execute(()-> {
List<DynamicUITable> dynamicUITableList = response.body();
if (dynamicUITableList != null) {
if (dataExist) {
dynamicUIDao.deleteRecords(screenName);
dynamicUIDao.save(dynamicUITableList);
} else {
dynamicUIDao.save(dynamicUITableList);
dynamicUIDao.load(screenName);
}
/* From here observer is calling whenever live data changes but what i need is , i need to
call observer only one time after completion all query operation*/
}
});
}
@Override
public void onFailure(Call<List<DynamicUITable>> call, Throwable t) {
}
});
});
}catch (Exception ex){
ex.printStackTrace();
}
}
解决方案
您可以在一个Transaction中运行所有数据库操作。这将导致您的观察者收到一次通知,因为插入、替换和删除将在单个事务中完成。
推荐阅读
- html - HTML / CSS / SVG - 响应式文本和背景
- python - 如何在 fstrings 中使用 .loc?
- python - 如何用 null 替换 pandas 列中的特定字符?
- mysql - 具有特定选择的mysql默认排序顺序
- r - 在自定义函数中使用 ggplot stat_function "group"
- makefile - `Makefile`规则重新生成目标文件目录而不从头开始重新编译?
- django - Django DRF - 使用序列化程序 + json 更新配置文件
- sql - 使用数据透视并获取错误缺少表达式
- mongodb - 在 aws ec2 服务器上安装 MongoDB
- spring - 使用 @DBref 使用 Postman 发送 POST 请求