2016-11-01 10 views
0

こんにちは、私はアンドロイドのアプリケーションでブール型の戻り値のメソッドを持っています。どのように私のメソッドで私はAPIを呼び出しているが、私のメソッドは、コードのAPIコールバックの部分を待つことなく、最初のブール値をimmidately返す..どのように私はこれを解決するのですか?次のコードを見てみてください。android/java:メソッドの一部が実行されるまで、メソッドが値を返すのを停止します。

public boolean validateForm() { 
      flag=true; 
    //---- THIS CODE DOES NOT EXECUTE.. THE RETURN STATEMENT IS DIRECTLY EXECUTED--- 
       checkSourceCode(new BooleanCallBack() { 
        @Override 
        public void onSuccess(boolean result) { 
         validateCode = result; 
         if (!validateSourceCode(result)) { 
          flag = false; 
         } 
         if (flag) { 
          saveData(); 
         } 
        } 
       }); 
    //---- THE ABOVE CODE DOES NOT EXECUTE.. THE RETURN STATEMENT BELOW IS DIRECTLY EXECUTED 

       return flag; //This part is directly RETURNED without waiting for the above part of the code to execute 
     } 

を私はフアンFelippoによって与えられた答えに従っている場合、私は、その後に対処するための別の問題があります。

私はvalidateForm()メソッドを呼び出しています場所です。 HERE

public boolean validate(int position) { 

     switch (position) { 
      case 0: 
       if (signUp_bgp_1.validateForm()) { 
        signUp_bgp_2.updateFields(); 
        return true; 
       } else { 
        return false; 
       } 

      case 1: 
       signUp_bgp_2.validateForm(new BooleanCallBack() { 
        @Override 
        public void onSuccess(boolean result) { 
         return result; // I GET ERROR HERE "CANNOT RETURN A VALUE FROM A VOID RETURN TYPE" 
        } 
       }); 
      case 2: 
       return signUp_bgp_3.validateForm(); 

はMY COMPLETEコードです:

私はケース1

にvalidateFormメソッドを呼び出します*
public boolean validate(int position) { 
      switch (position) { 
       case 0: 
        if (signUp_bgp_1.validateForm()) { 
         signUp_bgp_2.updateFields(); 
         return true; 
        } else { 
         return false; 
        } 

       case 1: 
        signUp_bgp_2.validateForm(new BooleanCallBack() { 
         @Override 
         public void onSuccess(boolean result) { 
          bool =result; //CANNOT RETURN BOOLEAN HERE HOW TO HANDLE THIS? 
         } 
        }); 
       case 2: 
        return signUp_bgp_3.validateForm(); 
       case 3: 
        if (signUp_bgp_4.validateForm()) { 
         signUp_bgp_5.updateDetails(); 
         return true; 
        } else { 
         return false; 
        } 
       case 4: 
        if (signUp_bgp_5.validateForm()) { 
//      signUp_bgp_5.updateDetails(); 
         return true; 
        } else { 
         return false; 
        } 

       default: 
        return signUp_bgp_1.validateForm(); 
      } 
     } 

*あなたのメソッドが同期している間、私の修正validateForm方法はフアンFellipoの答え

public void validateForm(final BooleanCallBack mainCallback) { 
     flag=true; 

      checkSourceCode(new BooleanCallBack() { 
       @Override 
       public void onSuccess(boolean result) { 
        validateCode = result; 
        if (!validateSourceCode(result)) { 
         flag = false; 
        } 

        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 (!validateCountry()) { 
         flag = false; 
        } 
        if (!validatelandmark()) { 
         flag = false; 
        } 
        if (!validateDistrict()) { 
         flag = false; 
        } 

//  if (!validateCity()) { 
//   flag = false; 
//  } 

//  if (!validateMobilenumber()) { 
//   flag = false; 
//  } 

        if (!validatePincode()) { 
         flag = false; 
        } 


        if (!validateFullfillment()) { 
         flag = false; 
        } 
        if (flag) { 
         saveData(); 
        } 
        mainCallback.onSuccess(flag); 
       } 
      }); 
    } 
+0

は、あなたのコードがするonSuccessに入っていることを確認するために、ブレークポイントを使用しました:同期/非同期とコールバックが見る程度

someObject.validateForm(new BooleanCallBack() { @Override public void onSuccess(boolean result) { //DO STH WITH RESULT } }); 

さらに詳しい情報そしてif条件?それはすぐに文 – FabioR

+0

を返すようにジャンプしている可能性がありますまさに!何らかの理由でonSuccessの部分が実行されるのを待っているわけではありません。 –

+0

コールバックが成功していない可能性があるので、スキップしている可能性があります。あなたはonFailureメソッドを使ってみましたか?おそらくそれを使用してみて、コードがそれを通過していることを確認します。このようにして、コードロジックをチェックするだけでなく、コールバックが機能しているかどうかをチェックします。 – FabioR

答えて

3

に応じてAPIメソッドが非同期です。応答が準備されているときにコールバックを提供できます。 試してみてください。

public void validateForm(final BooleanCallBack mainCallback) { 
     flag=true; 

      checkSourceCode(new BooleanCallBack() { 
       @Override 
       public void onSuccess(boolean result) { 
        validateCode = result; 
        if (!validateSourceCode(result)) { 
         flag = false; 
        } 
        if (flag) { 
         saveData(); 
        } 
        mainCallback.onSuccess(flag) 
       } 
      }); 
    } 

とメソッドを呼び出す: What is a callback in java

+0

更新された質問を確認してください –

+1

あなたは同じジレンマになっていますここでメソッド:public boolean validate(int position)はブロックされています同期メソッドは更新されたメソッドpublic void validateForm(final BooleanCallBack mainCallback)Async –

+0

完全なコードを貼り付けてください –

関連する問題