2015-10-14 4 views
2

Что я хочу сделать, когда выполнено onSuccess, queryLogin return true, а если выполнено onFailuer, то queryLogin return 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; 
} 
+0

Вы пробовали Getter и setter для 'isSuccess' ?? –

ответ

1

Здесь вы пытаетесь смешивать синхронное и асинхронное поведение, которое не может работать.

Метод post() просто запускает HTTP-сообщение и выполнение вашего метода входа продолжается до конца, не дожидаясь результата этого сообщения. Вот для чего здесь находится AsyncHttpResponseHandler. Он вызывается, когда приходит ответ на post().

Сетевые действия (и все другие задачи, которые могут занять много времени) всегда асинхронно, чтобы не заморозить пользовательский интерфейс вашего приложения.

+0

да, спасибо. Я лучше понимаю механизм метода обратного вызова. –

1

Сделать методы класса возвращают логическое значение и поймать его

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

UPDATE:

Как вы можете видеть '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; 
    } 
}); 
+0

Как вы видите, «onSuccess» - это метод переопределения, поэтому, если я изменяю возвращаемое значение с «void» на «boolean», оно не отменяется. –

+0

@ShuaiWang это не значит, что вы не можете изменить объявление класса, но если вы не можете, пожалуйста, любезно проверьте мое обновление –

1

Вы должны добавить определенный метод к своему внешнему классу и вызвать его из внутреннего класса. Этот метод должен получить аргумент и просто настроить внешнюю переменную-член класса; затем используйте эту переменную, как хотите.

0

Вы можете создать метод внутри класса как

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

при вызове его с обеих onSuccess и onFailure с соответствующим аргументом.

Смежные вопросы