当所有 if 语句都为真时,我陷入了无限循环
UserRepo 类
public int update(Users user) throws ExecutionException, InterruptedException {
Callable<Integer> updateCallable = new Callable<Integer>() {
@Override
public Integer call() throws Exception {
return sqlite_room_dao.update(user.getId(),user.getUsername(),user.getPassword(),user.getPassword2());
}
};
Future<Integer> future = Executors.newSingleThreadExecutor().submit(updateCallable);
return future.get();
}
ViewModel 类
public int update(Users users) throws ExecutionException, InterruptedException, TimeoutException {
logger.LogError(TAG, "Update", logger.jsonConverter(users));
return userRepo.update(users);
}
MainActivity 类
final boolean[] isUpdating = {false};
UserViewModel userViewModel = new ViewModelProvider(this).get(UserViewModel.class);
btnUpdate.setOnClickListener(view -> {
if (!isUpdating[0]) {
isUpdating[0] = true;
Users user = new Users(5, "kylo", "14", "14");
userViewModel.getId(user.getId()).observe(this, users -> {
if (users.size() == 1) {
logger.LogError(tag, "Checked if exist", "true");
try {
int result = userViewModel.update(user);
if (result > 0) {
logger.LogError(tag, "Update", "success");
} else {
logger.LogError(tag, "Update", "failed");
}
} catch (ExecutionException | InterruptedException | TimeoutException e) {
e.printStackTrace();
}finally {
isUpdating[0] = false;
}
} else {
logger.LogError(tag, "Checked if exist", "false");
isUpdating[0] = false;
}
});
}
});
我试图放置一个布尔标志来防止多重循环。但它什么也没做
我认为这是因为你把观察功能放在按钮里面
onclickListener
所以每次点击按钮时观察功能都会再次调用。
你需要把 observe 放在外面,只要用 activity 初始化它 1 次。然后使用按钮 onclick 调用 ViewModel 来处理您的任务,并在完成后发布结果以再次在活动中观察它。