Retrofit call dentro de AsyncTask

Recientemente he empezado a desarrollar una aplicación para Android y he decidido usar Retrofit como cliente de un servicio REST, pero no estoy seguro si mi enfoque es bueno:

yo. He implementado una llamada asíncrona a mi api, que se llama dentro del método doInBackground de AsyncTask. La preocupación : haber leído este artículo me confundió. ¿No son AsyncTasks adecuados para este tipo de tareas? ¿Debo hacer la llamada a la API directamente desde la Actividad? Entiendo que los métodos de devolución de llamada de Retrofit se ejecutan en el subproceso de interfaz de usuario, pero ¿qué tal la llamada a través de HTTP? ¿Retrofit crea hilos para eso?

Ii. Quiero que la AuthenticationResponse se guarde dentro de un objeto SharedPreferences, que no parece estar disponible dentro del método de éxito de la devolución de llamada. ¿Alguna sugerencia / buena práctica?

Gracias de antemano 🙂

Aquí está mi doInBackGroundMethod:

@Override protected String doInBackground(String... params) { Log.d(LOCATION_LOGIN_TASK_TAG, params[0]); LocationApi.getInstance().auth(new AuthenticationRequest(params[0]), new Callback<AuthenticationResponse>() { @Override public void success(AuthenticationResponse authenticationResponse, Response response) { Log.i("LOCATION_LOGIN_SUCCESS", "Successfully logged user into LocationAPI"); } @Override public void failure(RetrofitError error) { Log.e("LOCATION_LOGIN_ERROR", "Error while authenticating user in the LocationAPI", error); } }); return null; } 

I. Retrofit soporta tres formas de hacer una solicitud:

  • Sincrónico

Tienes que declarar el método que devuelve la respuesta como valor, por ejemplo:

  @GET("/your_endpoint") AuthenticationResponse auth(@Body AuthenticationRequest authRequest); 

Este método se realiza en el subproceso en el que se llama. Así que no se puede llamar en el hilo principal / UI .

  • asincrónico

Debe declarar el método void que contiene la devolución de llamada con la respuesta como el último parámetro, por ejemplo:

  @GET("/your_endpoint") voud auth(@Body AuthenticationRequest authRequest, Callback<AuthenticationResponse> callback); 

La ejecución de la solicitud se llama en el nuevo subproceso de fondo, y los métodos de devolución de llamada se realizan en el subproceso al que se llama el método. Así que puede llamar a este método en el subproceso principal / UI sin nuevo subproceso / AsyncTask.

  • Uso de RxAndroid

La última manera que sé es el método que utiliza RxAndroid. Tienes que declarar el método que devuelve la respuesta como observable con valor. Por ejemplo:

  @GET("/your_endpoint") Observable<AuthenticationResponse> auth(@Body AuthenticationRequest authRequest); 

Este método también admite hacer solicitud de red en un nuevo subproceso. Así que no tienes que crear nuevo hilo / AsyncTask. El método de devolución de llamada Action1 desde subscribe se llama en UI / thread principal.

II. Puede llamar a su método sólo en Actividad y puede escribir sus datos en SharedPreferences como se muestra a continuación:

 SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context); sharedPreferences.edit() .put...//put your data from AuthenticationResponse //object which is passed as params in callback method. .apply(); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.