Проблема с библиотекой AsyncTask и Volley

Я пытаюсь использовать библиотеку Volley и AsyncTask для подключения моего приложения к локальному серверу. Но, как вы можете видеть на фотографиях, размещенных ниже, метод onPostExecute() вызывается до завершения метода doInBackground(), и я не знаю почему. Подключение к серверу выполнено хорошо, тестировал.

MainActivity.java

public class MainActivity extends AppCompatActivity {

Button button;
TextView textView, textView2;

WSPOSTconBody wsposTconBody;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    button = (Button) findViewById(R.id.button);
    textView = (TextView) findViewById(R.id.text);
    textView2 = (TextView) findViewById(R.id.textView);



    try {
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();

        textView2.setText(String.valueOf(isConnected));
    }catch (NullPointerException e){
        textView2.setText("NullpointerException");
    }

    wsposTconBody = new WSPOSTconBody(MainActivity.this, new OnResponsePOSTconBody() {
        @Override
        public void onSuccess(String response) {
            textView.setText(response);
        }

        @Override
        public void onFailure(Exception exception) {
            if (exception != null){
                textView.setText(exception.toString());
            }
        }
    });

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (v.getId() == R.id.button){
                wsposTconBody.execute("Eder", "Villar");
            }
        }
    });

}

WSPOSTconBody.java

public class WSPOSTconBody extends AsyncTask<String, Void, String>{

private Context applicationContext;

private String USERNAME;
private String PASSWORD;
private String url;

private String respuesta;
private Exception exception;

private OnResponsePOSTconBody onResponsePOSTconBody;

public WSPOSTconBody(Context context, OnResponsePOSTconBody callback){

    USERNAME = "admin";
    PASSWORD = "xyzyx";

    url = "http://localhost:8081/persona/hola";

    applicationContext = context;
    onResponsePOSTconBody = callback;
}

@Override
protected String doInBackground(String... params) {

    try {

        RequestQueue requestQueue = Volley.newRequestQueue(applicationContext);

        JSONObject jsonBody = new JSONObject();
        jsonBody.put("firstname", params[0]);
        jsonBody.put("lastname", params[1]);
        final String requestBody = jsonBody.toString();

        /* ******************* */
        StringRequest objectRequest = new StringRequest(Request.Method.POST, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {

                        respuesta = response.toString();
                        Log.d("Respuesta", response);

                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                        exception = error;
                        Log.d("Excepcion web", error.toString());

                    }
                }

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

            @Override
            public byte[] getBody() {
                try {
                    return (requestBody.getBytes("utf-8"));
                } catch (UnsupportedEncodingException uee) {
                    VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", requestBody, "utf-8");
                    return null;
                }
            }

            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                HashMap<String, String> headers = new HashMap<String, String>();

                String credentials = USERNAME + ":" + PASSWORD;
                String auth = "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP);
                headers.put("Authorization", auth);
                headers.put("Content-Type", "application/json; charset=utf-8");
                return headers;
            }
        };
        /* ******************* */

        requestQueue.add(objectRequest);

    }catch (JSONException e){
        e.printStackTrace();
    }

    return respuesta;
}

@Override
protected void onPostExecute(String respuesta) {
    if (onResponsePOSTconBody != null) {
        Log.d("RESPUESTA", "INTERFAZ FUNCIONA");
        if (exception == null) {
            onResponsePOSTconBody.onSuccess(respuesta);
        } else {
            onResponsePOSTconBody.onFailure(exception);
        }
    }
    else {
        Log.d("RESPUESTA", "FALLO LA INTERFACE");
    }
}
}

И интерфейс - OnResponsePOSTconBody.java

public interface OnResponsePOSTconBody {

void onSuccess(String response);
void onFailure(Exception exception);

}

А вот что показывает консоль, когда я нажимаю кнопку

Проблема с библиотекой AsyncTask и Volley

Как видите, D / RESPUESTA: INTERFAZ FUNCIONA использует метод onPostExecute(), а D / Respuesta: Hola Eder Villar! находится в методе doInBackground(), который вызывается перед другим методом

Возможно, мне нужно дождаться ответа сервера, остановив до этого метод doInBackground(), но я не знаю, как это сделать.

Спасибо

Volley обрабатывает резьбу за вас. Нет необходимости в асинхронной задаче

Gabe Sechan 23.07.2018 20:50

Ваш запрос уже будет асинхронным, иначе Response.Listener был бы бесполезен - ваша асинхронная задача вернется до того, как будет вызван Listener::onResponse.

Mark Keen 23.07.2018 20:50

@GabeSechan Правда? Итак, нужен ли мне только код, который находится внутри метода doInbackground ()?

ProRiderZ115 23.07.2018 21:05

Возможный дубликат Залп и AsyncTask

J. Jefferson 23.07.2018 23:16
1
4
36
0

Другие вопросы по теме