2015-10-14 91 views
2

我想要做的是當執行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; 
} 
+0

你有沒有試過Getter和setter for'isSuccess'? –

回答

1

您正試圖在這裏混合同步和異步行爲,這是行不通的。

post()方法只是觸發一個HTTP帖子,並且您的登錄方法的執行繼續到最後而不等待該帖子的結果。這就是AsyncHttpResponseHandler在這裏。它在對post()的回覆到達時被調用。

網絡活動(以及可能需要很長時間的所有其他任務)始終是異步的,以免凍結應用的UI。

+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',它不是覆蓋仍然

實際上,如果變量不是最終的,你不能在內部類中操作它們......但是,小心,知道你沒有創建類,AND如果它只用於本地,在這個方法範圍內,那麼你可以使用這個:

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

您可以從兩個onSuccessonFailure與相應的參數調用它的類中創建方法類似

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