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
так что вы можете проверить его статус.