2016-11-02 3 views
0

Ich habe eine executorService, die für den executorService Teil wartet nicht abgeschlossen und es gibt direkt den Rückgabewert ohne unten zu warten ist mein Code: Bitte sehen, ob ich bin die Umsetzung der executorService mich richtig es und helfen zu korrigieren, wennandroid: ExecutorService: - ExecutorService wartet nicht ExecutorService abzuschließen

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 
    } 

Antwort

1

erforderlich es sieht aus wie es einige Verwirrung auf, was von einem Rückruf stellt die Ausführung im Vergleich zu einem Rückruf gebaut.

Der folgende Code erstellt und übermittelt eine neue Runnable Aufgabe, aber die Runnable druckt nur eine Nachricht und dann eine BooleanCallBack Konstruktion. Ich bin nicht sicher, was genau BooleanCallBack tut, aber angenommen, es ist wirklich ein Rückruf, wird der Code im Rückruf nicht sofort ausgeführt werden.

Der Einfachheit halber lässt man denke an die Runnable wie folgt aus:

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"); 
      } 
     }); 
    } 
}); 

Wenn Sie future.get() aufrufen, es wartet auf die run() Ausführung der Methode zu vervollständigen, die die BooleanCallBack Konstruktion beinhaltet aber nicht tatsächlich ausgeführt wird. Ähnlich wie beim Erstellen eines neuen Objekts Runnable nicht bedeutet, dass der Code in der run()-Methode ausgeführt wird.

Wenn Ihr Code also future.get() aufruft, können Sie nur sicher sein, dass die run() - Methode abgeschlossen ist (d. H. Sie haben die Meldung "runnable is running" erhalten). NICHT, die BooleanCallBack.onSuccess() ausgeführt hat.

Wenn Sie tatsächlich auf das Bit "Callback vom runnable is running" warten möchten, müssen Sie einen Verweis auf BooleanCallBack einrichten, damit Sie seinen Status überprüfen können.

Verwandte Themen