另一个完成后执行一个Volley请求

时间:2015-06-18 16:05:27

标签: android android-volley

我有两个Volley请求。第一个请求验证用户;第二个从服务器获取数据。

如果我发送GET请求且用户未经过身份验证,我想触发第一个请求,对用户进行身份验证,然后在用户成功通过身份验证后继续执行第二个请求。

1 个答案:

答案 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请求。

我认为像这样嵌套回调不是一个好习惯,但我稍后会修复它并更新我的答案。

如果有人有更好的方法来实现它,请发布另一个答案!