Я пытаюсь использовать библиотеку 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);
}
А вот что показывает консоль, когда я нажимаю кнопку
Как видите, D / RESPUESTA: INTERFAZ FUNCIONA использует метод onPostExecute(), а D / Respuesta: Hola Eder Villar! находится в методе doInBackground(), который вызывается перед другим методом
Возможно, мне нужно дождаться ответа сервера, остановив до этого метод doInBackground(), но я не знаю, как это сделать.
Спасибо
Ваш запрос уже будет асинхронным, иначе Response.Listener был бы бесполезен - ваша асинхронная задача вернется до того, как будет вызван Listener::onResponse.
@GabeSechan Правда? Итак, нужен ли мне только код, который находится внутри метода doInbackground ()?
Возможный дубликат Залп и AsyncTask
Volley обрабатывает резьбу за вас. Нет необходимости в асинхронной задаче