2016-11-02 2 views
0

У меня есть 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»). NOT, выполненный BooleanCallBack.onSuccess().

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

Смежные вопросы