Android:ExecutorService:- ExecutorService не ждет завершения executorService

У меня есть executorService что не ждет executorService часть, чтобы завершить, и она напрямую возвращает возвращаемое значение без ожидания ниже мой код executorService и помогите мне исправить это при необходимости

 public boolean validateForm() {
        flag=true;
        executorService = Executors.newSingleThreadExecutor();
            Future f = executorService.submit(new Runnable() {
                public void run() {
                    Log.e("FLAGssssss", "" + flag);
                    checkSourceCode(new BooleanCallBack() {
                        @Override
                        public void onSuccess(boolean result) {
                            Log.e("RESULT  ISSSSS", "" + result);
                            validateCode = result;
                            Log.e("validateSourceCode  ISSSSS", "" + validateSourceCode(result));
                            if (validateSourceCode(result) == false) {
                                flag = false;
                            }
                            Log.e("FLAG ISSSSS", "" + flag);
                        }
                    });
                }
            });
            try {
                if (f.get() != null) {
                    flag = true;
                }
                Log.e("FUTURE IS", "" + f.get());

            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        if (!accept_checkbox.isChecked()) {
            Toast.makeText(getActivity().getBaseContext(), "Accept The Terms & Conditions To Proceed", Toast.LENGTH_LONG).show();
            //        accept_checkbox.requestFocus();
            flag = false;
        }
        if (!validateAddress()) {
            flag = false;
        }
        if (!validatelandmark()) {
            flag = false;
        }
        if (!validateDistrict()) {
            flag = false;
        }
        if (!validatePincode()) {
            flag = false;
        }
        if (!validateFullfillment()) {
            flag = false;
        }
        if (flag) {
            saveData();
        }

        executorService.shutdown();
        return flag; //flag is returned even before the executorService above is executed first
    }

1 ответ

Похоже, что существует некоторая путаница в том, что представляет собой обратный вызов от создания или выполнения обратного вызова.

Следующий код создает и отправляет новый Runnable задача, но Runnable только печатает сообщение, а затем создает BooleanCallBack, Я не уверен, что именно BooleanCallBack делает, но при условии, что это действительно обратный вызов, код в обратном вызове не будет выполнен сразу же.

Для простоты давайте подумаем о Runnable как это:

Future future = executorService.submit(new Runnable() {
    public void run() {
        sysou("runnable is running");
        checkSourceCode(new BooleanCallBack() {
            @Override
            public void onSuccess(boolean result) {
                sysou("callback from the runnable is running");
            }
        });
    }
});

Когда вы вызываете future.get(), он ждет run() метод завершения выполнения, который включает в себя построение BooleanCallBack но на самом деле не работает. Похоже на то, как строят новый Runnable объект не означает код в run() метод выполнен.

Так что если ваш код звонит future.get()единственное, в чем вы можете быть уверены, это то, что метод run() завершен (т.е. вы получили сообщение "runnable is running"). НЕ это BooleanCallBack.onSuccess() выполнил.

Если вы действительно хотите дождаться бита "обратный вызов из runnable is running", то вам нужно установить ссылку на BooleanCallBack так что вы можете проверить его статус.

Другие вопросы по тегам