【问题标题】:How to return the value from inner class to outer class?如何将值从内部类返回到外部类?
【发布时间】:2015-10-14 08:51:10
【问题描述】:

我想做的是当onSuccess方法执行时,queryLogin返回true,而如果onFailuer方法执行,queryLogin返回false; 但是如您所知,在 java 中,我无法从内部类修改外部类值。所以我只是想知道如何解决问题并实现我的目标。

 public static boolean queryLogin(String username, String passowrd){
    boolean isSuccess = false;
    params.put("username", username);
    params.put("password", passowrd);
    VStarRestClient.post(LOGIN_URL, params, new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
            isSuccess = true;//cannot
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
            String responseContent = new String(responseBody);
            isSuccess = false;//cannot
        }
    });

    return isSuccess;
}

【问题讨论】:

  • 你试过isSuccess的getter和setter吗??

标签: android inner-classes anonymous-inner-class


【解决方案1】:

你试图在这里混合同步和异步行为,这是行不通的。

post() 方法只是触发一个 HTTP 帖子,并且您的登录方法的执行将继续到其结束,而无需等待该帖子的结果。这就是AsyncHttpResponseHandler 的用途。当post() 的回复到达时调用它。

网络活动(以及所有其他可能需要很长时间的任务)总是异步的,不会冻结您应用的 UI。

【讨论】:

  • 好的,谢谢。我对回调方法机制有了更深入的了解。
  • Flutter 框架的Dart 语言中,可以非常简单地将Async 方法转换为Sync,方法是在末尾使用“.then(){}”关键字方法,我在Android Java中也有同样的问题,我认为Java更强大说不可能。
【解决方案2】:

你应该在你的外部类中添加一个特定的方法,并从内部类中调用它。这个方法应该接收一个参数并简单地设置一个外部类成员变量;然后根据需要使用该变量。

【讨论】:

    【解决方案3】:

    使类方法返回一个布尔值并捕获它

    boolean isSucces = VStarRestClient.post(LOGIN_URL, params, new AsyncHttpResponseHandler() {
        @Override
        public boolean onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
            return true;
        }
    
        @Override
        public boolean onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
            String responseContent = new String(responseBody);
            return false;
        }
    });
    

    更新:

    你可以看到'onSuccess'是一个覆盖方法,所以如果我将返回值从'void'更改为'boolean',它仍然不会被覆盖

    实际上,如果变量不是最终的,你不能在内部类中操作它们......但是,要小心,知道你没有创建这个类,并且如果它只在本地使用,在这个方法范围内,那么你可以使用这个:

    final boolean isSuccess[] = {false};
    VStarRestClient.post(LOGIN_URL, params, new AsyncHttpResponseHandler() {
        @Override
        public boolean onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
            isSuccess[0] = true;
        }
    
        @Override
        public boolean onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
            String responseContent = new String(responseBody);
            isSuccess[0] = true;
        }
    });
    

    【讨论】:

    • 如您所见,'onSuccess' 是一种覆盖方法,所以如果我将返回值从 'void' 更改为 'boolean',它仍然不会被覆盖。
    • @ShuaiWang 这并不意味着您不能更改班级声明,但如果您不能,请查看我的更新
    【解决方案4】:

    你可以在你的类中创建方法

    processQueryResult(boolean isSuccess){
       //..some logic with isSuccess value
    }
    

    onSuccessonFailure 调用它并带有相应的参数。

    【讨论】:

      猜你喜欢
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 2013-04-26
      相关资源
      最近更新 更多