我有两个Volley请求。第一个请求验证用户;第二个从服务器获取数据。
如果我发送GET
请求且用户未经过身份验证,我想触发第一个请求,对用户进行身份验证,然后在用户成功通过身份验证后继续执行第二个请求。
答案 0 :(得分:2)
所以,解决方案非常简单。 :)
在我了解了回调及其工作方式后,我想出了如何做到这一点。所以,我实现了一个声明我想调用的方法的接口:
public interface AuthenticationCallback {
public void onLoginSuccess(String result);
public void onLoginError(String result);
}
public interface ResponseCallback {
public void onLoginSuccess(String result);
public void onAuthorizationError(String result);
}
我的功能:
public void getConversationMessages(final Context context, final String conversationID, final ResponseCallback responseCallback) {
final String url = GET_CONVERSATION_MESSAGES + conversationID;
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
if (responseCallback != null) {
responseCallback.onLoginSuccess(response);
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
if (error.networkResponse != null && error.networkResponse.statusCode == HttpURLConnection.HTTP_UNAUTHORIZED){
if (responseCallback != null) {
responseCallback.onAuthorizationError(error.getMessage());
}
}
}
})
{
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Cookie", AppSingleton.getInstance(context).getCookie());
headers.put("Content-Type", "application/json");
return headers;
}
};
AppSingleton.getInstance(context).getRequestQueue().add(stringRequest);
}
}
我的活动:
ServerConnection.getInstance().getConversationMessages(getApplicationContext(), id, new ResponseCallback() {
@Override
public void onLoginSuccess(String result) {
}
@Override
public void onAuthorizationError(String result) {
ServerConnection.getInstance().loginFunction(getApplicationContext(), userID, new AuthenticationCallback() {
@Override
public void onLoginSuccess(String result) {
ServerConnection.getInstance().getConversationMessages(getApplicationContext(), conID, new ResponseCallback() {
@Override
public void onLoginSuccess(String result) {
}
@Override
public void onAuthorizationError(String result) {
}
});
}
@Override
public void onLoginError(String result) {
}
});
}
});
基本上,代码会尝试发送GET
请求。如果用户未经过身份验证,那么它将执行onAuthorizationError()中的代码,该代码将对用户进行身份验证。用户成功通过身份验证后,将再次发送GET
请求。
我认为像这样嵌套回调不是一个好习惯,但我稍后会修复它并更新我的答案。
如果有人有更好的方法来实现它,请发布另一个答案!