Я использую Android Room и у меня есть логический метод, который запрашивает БД через Executor, чтобы узнать, используется ли уже предоставленный пользователем идентификатор. все работает нормально, но иногда ответ от вызова DB приходит поздно к основному потоку, что означает, что мой код не знает, новый или старый идентификатор. Я хочу, чтобы код в методе ожидал, пока runOnUiThread внутри исполнителя доставит результат, с которым остальная часть метода будет работать.
//check id validity with two different error messages
int isNew=-1;
void setIsNewId(int result){
isNew=result;
}
private boolean checkId(){
String id=mId.getText().toString().trim();
try{
final int parseId=Integer.parseInt(id);
AppExecutors.getInstance().diskIO().execute(new Runnable() {
@Override
public void run() {
final int result=mDb.clientDao().isIdNew(parseId);
runOnUiThread(new Runnable() {
@Override
public void run() {
setIsNewId(result);//<--THIS ARRIVES TOO LATE TO MAIN THREAD
}
});
}
});
//THIS SHOULD WAIT UNTIL RESULT IS AVAILABLE
if (isNew==1 && !id.isEmpty()){
ilId.setErrorEnabled(false);
return true;
}else if(isNew==0){
ilId.setErrorEnabled(true);
ilId.setError("Id has to be new");
mId.setError("Id needs to be new");
Toast.makeText(this,"Id needs to be new", Toast.LENGTH_LONG).show();
return false;
}else{
Toast.makeText(this,"its taking too long", Toast.LENGTH_LONG).show();
return false;
}
}catch(Exception e){
ilId.setErrorEnabled(true);
ilId.setError("Id has to be numeric");
mId.setError("Id has to be numeric");
Toast.makeText(this,"Id needs to be numeric", Toast.LENGTH_LONG).show();
return false;
}
}
Я уже пытался выполнить синхронизацию на объекте, используя мьютекс, CountDownLatch, спящий вызов. но все, кажется, замораживают мой интерфейс и приводят к сбою приложения. Я знаю, что у исполнителей есть метод submit (), но я не смог найти пример того, как использовать его в контексте моего вложенного потока. Я довольно новичок в Android, и это мое первое столкновение с проблемами синхронизации. может быть, решение простое, и я просто делаю что-то не так. любая помощь очень ценится