'Android Volley POST request out of synchronization

I'm using the implementation 'com.android.volley:volley:1.1.1' to make a POST call to a REST web service. Unfortunately, the conclusion (i.e. User does not exist) is reached before the response comes back from the server and is always wrong (In reality user actually does exist).

On the console, the logger messages appear in the wrong order:

E/: THIS IS SUPPOSED TO HAPPEN SECOND - USER NOT FOUND ALERT

I/: THIS IS SUPPOSED TO HAPPEN FIRST: VALIDATING DATA

After hours of reading, I found that a Callback Interface will ensure proper execution order. However, after implementing it, the result is the same. What could be wrong, please?

ControladorLoginExistente.Java

public class ControladorLoginUsrExistente {

    public AbstractMap.SimpleEntry<String, Map<String, String>> callEndpointLoginUsrExistente(Context context) {

        try {

            JSONObject jsonRequest = new JSONObject();

            jsonRequest.put("email", "[email protected]");
            jsonRequest.put("password", "12345");

            final JSONObject[] jsonResponse = {null};

            new PostRequestConVolley().getResponse(Constantes.URL_ACCESO_USUARIO_EXISTENTE, jsonRequest, context, new VolleyCallback() {

                @Override
                public void onSuccessResponse(JSONObject jsonObject) {

                    jsonResponse[0] = jsonObject;

                    Log.i(null,"THIS IS SUPPOSED TO HAPPEN FIRST: VALIDATING DATA");

                }
            });

            Boolean exito = jsonResponse[0].getBoolean("exito");
            String descripcion = jsonResponse[0].getString("descripcion");
            String codigoHttp = jsonResponse[0].getString("codigoHttp");
            JSONArray respuestaTransaccion = jsonResponse[0].getJSONArray("respuestaTransaccion");


            if(exito == false || codigoHttp.equals("200")){
                Log.e(null,"THIS IS SUPPOSED TO HAPPEN SECOND: USER NOT FOUND ALERT");
                return new AbstractMap.SimpleEntry<>(descripcion, new HashMap<>());
            }

            Log.i(null,"THIS IS SUPPOSED TO HAPPEN SECOND: USER NOT FOUND ALERT");
            return new AbstractMap.SimpleEntry<>(Constantes.EXITO, new HashMap<>());


        } catch (Exception ex) {

            Log.e(null,"THIS IS SUPPOSED TO HAPPEN SECOND: USER NOT FOUND ALERT");
            return new AbstractMap.SimpleEntry<>("ERROR: " + ex.toString(), new HashMap<>());

        }
    }
}

PostRequestConVolley.java

public class PostRequestConVolley {


    public JSONObject getResponse(String url, JSONObject body, Context context, final VolleyCallback callback) {

        try {

            RequestQueue queue = Volley.newRequestQueue(context);

            JsonObjectRequest jsonRequest = new JsonObjectRequest(POST, url, body,
                    new Response.Listener<JSONObject>() {


                        @Override
                        public void onResponse(JSONObject response) {

                            callback.onSuccessResponse(response);

                        }
                    },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            Log.e(null, error.toString());
                        }

                    }) {

                @Override
                public Map<String, String> getHeaders() {
                    Map<String, String> params = new HashMap<String, String>();
                    params.put("Content-Type", "application/json");
                    params.put("Connection", "keep-alive");

                    return params;
                }

                @Override
                public String getBodyContentType() {
                    return "application/json; charset=utf-8";
                }

                @Override
                protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {

                    Log.i(null, "El HTTP code es:" + response.statusCode);

                    return super.parseNetworkResponse(response);
                }

            };


            queue.add(jsonRequest);


        } catch (Exception ex) {

            ex.printStackTrace();
        }


        return body;

    }


}

VolleyCallbackInterface

import org.json.JSONObject;

public interface VolleyCallback {

    void onSuccessResponse(JSONObject jsonObject);

}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source