miércoles, 11 de junio de 2014

REST en Android con retrofit y rxjava

REST en Android con retrofit y rxjava

En este tutorial voy a explicar como acceder a un servidor REST desde un terminal Android de forma asíncrona con muy pocas líneas de código, sin tener que preocuparse por situaciones como cambios de orientación de pantalla.

Para ello voy a utilizar una serie de librerías que describo a continuación.

Retrofit es una libreria  que nos permite hacer peticiones REST de una forma sencilla y elegante.

Rxjava es una libreria para componer programas asíncronos y basados en eventos utilizando sequencias de observables.

jonschema2pojo.org es un servicio online que recibe como entrada una respuesta en lenguaje JSON y da como resultado el conjunto necesario de clases para transformar nuestro ducoumento en objetos java.

gson: Librería android que nos permite convertir documentos JSON en objetos java definidos previamente.

  • JSON a POJO
Supongamos que tenemos un documento JSON, lo copiamos y la pegamos en jonschema2pojo.org. 
Después de seguir unos sencillos pasos, tendremos la representación en clases generada por los campos del documento, supongamos que se genera la clase Photo.


  • Peticiones REST

Con  las siguientes lineas de código ya podremos acceder a la url declarada dentro de GET.

Retrofit devuelve (opcionalmente)  un objeto de la clase Observable, que de forma asíncrona emite su resultado a sus suscriptores.

public interface UserPhoto{
@GET("/user/{id}/photo")
Observable<Photo> getUserPhoto(@Path("id") int id);
}
 
 
Nosotros en general no queremos subscribirnos solo al Observable que devuelve una llamada al metodo anterior, sino a todos ellos.

Con rxjava esto se realiza a través de la clase BehaviorSubject y el operador sitchOnNext.
 
 
BehaviorSubject: cuando un Subscriber se suscribe a BehaviorSubject comienza emitiendo el item emitido mas reciente del observable fuente y continúa emitiendo los items emitidos por el observable.


switchOnNext( ) se suscribe a un observable que emite observables. el Observable que devuelve switchOnNext se 
desinscribe del anterior observable emitido y comienza a emitir items del ultimo observable. 
 
 
BehaviorSubecten en este caso es un emisor de Observables que representan las respuestas del servidor y guarda la última. 

switchOnNext permite emitir los items emitidos de los Observables 
emitidos por BehaviorSubject. (se suscribe al ultimo observable emitido y se desinscribe automaticamente cuando hay uno nuevo. )



public class UserPhotoModel{
 
private BehaviorSubject<Observable<UserPhoto>> subject = BehaviorSubject.create();

public void setUserPhoto(Observable<UserPhoto> userPhotoObservable){
   subject.onNext(userPhotoObservable);
}

public Observable<UserPhoto> subscribeToUserPhoto(){
  return Observable.switchOnNext(subject);
}

Este fragmento es un ejemplo de uso.

public class f extends Fragment{
   public void onCreate(Bundle b){
        super.onCreate(b);
//suscribe al frament a las respuestas del servidor.
       AndroidObservable.bindFragment(this, userModel.subscribeToUserPhoto().subscribe(
            new Action1(UserPhoto photo)){
                    // renderPhoto();
         }));
 
//Realiza otra peticion ante algun evento por ejemplo un click.
     userModel.setUserPhoto(userPhotoInterface.getUserPhoto());
   }
   
Si además convertimos la clase UserModel en Singleton, por ejemplo, cada vez que se realice una peticion al servidor, BehaviorSubject guardará la respuesta de la ultima, asi que no tendremos que preocuparnos por situaciones como cambios de orientación de pantalla, ya que siempre recibiremos
la última respuesta, independientemente del momento de la suscripción.

}

No hay comentarios:

Publicar un comentario