【问题标题】:Always returning false as boolean value总是返回 false 作为布尔值
【发布时间】:2017-07-24 02:19:48
【问题描述】:

用户选择区域后,有一个名为checkCoverageGuest()的函数。此功能检查用户选择的区域是否在该餐厅的覆盖范围内。如果餐厅在覆盖范围内,则checkCoverageGuest() 将返回真值。当该餐厅没有报道时,checkCoverageGuest() 将返回 false。

如果该值为真,则进入下一个级别,即结帐。如果该值为 false,屏幕将显示所选餐厅不在覆盖范围内的 toast 错误消息。

现在,从这个函数checkCoverageGuest() 出来的每一个这个都是假的。

这是我的代码。

private boolean checkCoverageGuest() {
    try {
        String url;
        if (appPrefs.getLanguage().equalsIgnoreCase("ar"))
            url = LinksConstants.TEST_SERVER_URL
                    + LinksConstants.SEARCH_COVERAGE_AREA;
        else
            url = LinksConstants.TEST_SERVER_URL
                    + LinksConstants.SEARCH_COVERAGE_AREA;

        Intent startingIntent = getIntent();
        city_id = getIntent().getStringExtra("id");

        RequestParams params = new RequestParams();
        params.put("area", city_id);

        NetworkRestClient.post(url, params, new JsonHttpResponseHandler() {
            @Override
            public void onStart() {
                super.onStart();
                progressActivity.showLoading();
            }

            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                super.onSuccess(statusCode, headers, response);
                progressActivity.showContent();
                JSONObject[] restaurants_arr = null;

                hasCoverageGuest = true;
                try {
                    if (response != null) {

                        JSONArray restaurants = response.getJSONArray("restaurants");

                        // if restaurants deliver to that area
                        if (!restaurants.getString(0).equals("null")) {
                            restaurants_arr = new JSONObject[restaurants.length()];

                            int has_coverage = 1; // assume coverage is there..

                            for (int j = 0; j < Utils.cart_restaurants.size(); j++) {
                                RestaurantModel restaurant = Utils.cart_restaurants.get(j);
                                String restaurantCartID = restaurant.getId();

                                boolean found = false;
                                for (int i = 0; i < restaurants.length(); i++) {
                                    restaurants_arr[i] = restaurants.getJSONObject(i);

                                    String restaurantID = restaurants_arr[i].get("restaurant_id").toString();

                                    if (restaurantCartID.equals(restaurantID)) {
                                        found = true;
                                        break;
                                    }
                                }  //end of inner for
                                if (found == false) {
                                    Toast.makeText(CheckoutActivity.this, "There is no coverage for the Selected Area ", Toast.LENGTH_SHORT).show();
                                    hasCoverageGuest = false;
                                    break;
                                }

                            }
                            //end of outer for
                        } //end of if

                        else //if restaurants don't deliver to that area
                        {
                            hasCoverageGuest = false;
                        }

                    } // end of if response != null


                } // end of try

                catch (Exception ex) {
                    GSLogger.e(ex);
                    showError();
                }

            }

            @Override
            public void onFailure(int statusCode, Header[] headers, String errorResponse, Throwable throwable) {
                super.onFailure(statusCode, headers, errorResponse, throwable);

                showError();

                if (AppConstants.DEBUG_MODE)
                    showToast(errorResponse);
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
                super.onFailure(statusCode, headers, throwable, errorResponse);

                showError();
            }
        });

    } catch (Exception ex) {
        GSLogger.e(ex);
        showError();
    }
    return hasCoverageGuest;
}

【问题讨论】:

  • 您的方法将返回变量的默认值,因为直到稍后异步方法完成时该值才会更改。您将需要从回调中调用您的逻辑,或者使用另一个变量等待异步方法完成。
  • @MattClark 我怎样才能做到这一点?你能帮我吗 ?我对java很陌生

标签: java android


【解决方案1】:

您需要有一个回调来指定成功或失败。一种方法是使用接口。

public interface notifyGuestCoverage {
      void hasCoverage(int status);
}

在 onSuccess 中,

if (!restaurants.getString(0).equals("null")) {
     notifyGuestCoverageObj.hasCoverage(true);
}

该接口将由需要具有覆盖率值的类实现。例如,

class Example implements notifyGuestCoverage{
    void hasCoverage(int status){
            //your code
    }
}

【讨论】:

    【解决方案2】:

    您的private boolean checkCoverageGuest() 方法在public void onSuccess() 执行之前返回,这就是checkCoverageGuest() 总是返回false 的原因。

    如果您在获得 hasCoverageGuest 良好值后需要执行某些操作,请在 onSucess() 中执行它

    【讨论】:

      猜你喜欢
      • 2017-11-23
      • 1970-01-01
      • 2017-06-25
      • 1970-01-01
      • 2019-06-10
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      相关资源
      最近更新 更多