java - 安卓/java : stop a method from returning value until a part of the method is executed

标签 java android android-layout listview android-studio

嗨,我的 Android 应用程序中有一个 boolean 返回类型方法。在我的方法中,我如何调用 api,但我的方法立即返回第一个 boolean 值,而无需等待代码的 api 回调部分。我该如何解决这个问题?请看一下下面的代码:

    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
        }

如果我遵循 Juan Felippo 给出的答案,那么我还有另一个问题需要处理:

这是我调用 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) {
                       return result; // I GET ERROR HERE "CANNOT RETURN A VALUE FROM A VOID RETURN TYPE"
                   }
               });
            case 2:
                return signUp_bgp_3.validateForm();

这是我的完整代码:

*我在案例 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();
            }
        }

*我根据 Juan Fellipo 的回答修改了 validateForm 方法

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

最佳答案

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

并调用方法:

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

有关同步/异步和回调的更多信息,请参阅: What is a callback in java

关于java - 安卓/java : stop a method from returning value until a part of the method is executed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40360519/

相关文章:

java - 将 Nifi 属性值拆分为多个属性

android - 改造不适用于应用程序的发布版本

android - 在 app 模块中使用 buildSrc 模块版本

java - 没有数组名称的 JSONArray(地震示例)

android - PlaceAutocompleteFragment : automatically open SearchView

android - 表格布局列间距

java - 使用 Java Streams 过滤对象的 ArrayList 以返回 String 类型的 ArrayList

java - java中有类似module.export的东西吗?

Java - 在图像中正确绘制多行字符串

android - 在显示警报对话框时暂停进一步执行