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?
- Validación de Token GCM
- Disposición de restricción beta 4 - los fragmentos no funcionan
- Evitar que el diálogo de actividad de Android se cierre en el exterior
- Eliminación de archivos creados con FileOutputStream
- OutOfMemoryError ¿qué aumentar y cómo?
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; }
- API de la cámara: problemas con dispositivos cruzados
- ¿Qué versiones de Android SDK admiten la codificación en qué versiones de Java?
- Android.os.TransactionTooLargeException recuperar aplicaciones instaladas
- Realm.io Query con GroupBy
- Cómo suspender y reanudar los hilos en android?
- Aviary para Android - Cómo forzar la imagen de la cosecha usando editor.launch
- Android / Java convertir la fecha de cadena en el tipo largo
- ¿Cómo escribir letras árabes separadas?
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();
- Enviar valores de la actividad ViewPager a un fragmento por paquete
- Cómo conectar el lector de tarjetas NFC externo a Tablet