Ожидание, пока SingleThreadExecutor доставит результат в поток пользовательского интерфейса (RunOnUIThread), прежде чем продолжить выполнение потока пользовательского интерфейса. Android - PullRequest
0 голосов
/ 11 ноября 2018

Я использую 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, и это мое первое столкновение с проблемами синхронизации. может быть, решение простое, и я просто делаю что-то не так. любая помощь очень ценится

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...