Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cómo separar la lógica de la aplicación de la capa de red en Android usando Retrofit 2

Soy nuevo en Android y Retrofit y estoy enfrentando un problema.

Quiero tener mi deja para decir la clase "ServerCommunication" (singelton) donde toda la magia del Retrofit se hace y tendrá métodos públicos donde las llamadas del RESTO se hacen.

Quiero usar esta instancia de "ServerCommunication" en mis actividades para llamar al servicio Rest, pero eso es todo. La lógica de la aplicación debe realizarse en actividad. Así que de esta manera alguna actividad Login llama al método Login (POJORequest) en "ServerCommunication) donde se realiza la llamada REST real a través de la estructura Retrofit y se devuelve POJOResponse Así que la Actividad no se preocupa por la comunicación REST mientras ServerCommunication no se preocupa por qué lógica Debe ser aplicado a la respuesta del servicio REST desde entonces.

Con retrofit 2 no entiendo cómo puedo bloquear la actividad para esperar respuesta de retrofit y cómo se puede devolver. Bueno, podría pensar que puedo utilizar algunos métodos de devolución de llamada en la actividad para que los métodos pueden ser llamados de ServerCommunication "en OnPostExecute () para aplicar una lógica basada en los datos de la respuesta. Es sólo creo que debería ser un enfoque más simple.

Bueno, para aclarar todo este lío por encima de imaginar un caso sencillo: Usted tiene datos en su actividad principal, usted pasa estos datos a su clase de comunicación donde se realiza la llamada REST y se recibe la respuesta. Esta respuesta debe ser validada para continuar. Y desea que esta validación se realice en la actividad principal y NO en la clase de comunicación.

¿Qué patrón hay que hacer en Android con Retrofit2?

Gracias de antemano

  • Retofit2 error java.io.EOFException: Fin de la entrada en la línea 1 columna 1
  • ¿Cómo recuperar cuerpo de respuesta con RxAndroid y Retrofit 2?
  • RxJava + Retrofit -> BaseObservable para llamadas API para manejo centralizado de respuesta
  • Cómo resolver java.lang.AssertionError al crear OkHttpClient en mockito?
  • Retrofit @body con @multipart teniendo problema
  • Retrofit 2: responseBodyConverter convierte a objeto nulo
  • Añadir cookies para la actualización de 2 solicitudes
  • ¿Es posible mostrar la barra de progreso cuando se descarga a través de Retrofit 2 Asynchronous?
  • 2 Solutions collect form web for “Cómo separar la lógica de la aplicación de la capa de red en Android usando Retrofit 2”

    Lo que normalmente hago:

    • Cree su Interfaz (donde tiene todos sus métodos REST – GET & POST etc)
    • Cree una clase que realice las llamadas reales con los métodos correspondientes (consulte los métodos REST de la interfaz). Yo lo llamaría algo como ServiceAPIImplementor. Aquí es donde realmente crea su adaptador Retrofit.
    • En su actividad, cree una instancia de su clase implementor y llame a los métodos y pase los argumentos esperados.
    • Después de llamar a los métodos, probablemente debería mostrar un diálogo de progreso para que el usuario sepa que algo está ocurriendo.
    • Cuando se llama al método onResponse o onFailure , utilice un patrón de evento (biblioteca EventBus?) Para notificar a la actividad que se ha completado la operación de red. Una vez que la actividad ha recibido la notificación, entonces debe descartar el diálogo de progreso y actualizar la interfaz de usuario en consecuencia – con los datos recién recibidos o la operación completada (resultado esperado).

    Espero que esto le ayuda a acercarse a lo que está tratando de lograr!

    Interfaz de servicio (IPhotoService):

    @GET("/photos/kudos") Call<String> fetchKudos(@Header("Authorization") String authorization, @Query("offset") int offset, @Query("mt") boolean mt); 

    Service impl (PhotoService):

     private GoApiProvider<IPhotoService> mGoProvider = new GoApiProvider<>(); public Promiser<List<Photo>, HttpError> fetchKudos() { return new Promiser<>((resolve, reject) -> mGoProvider.getService(IPhotoService.class).fetchKudos(mSession.getToken(), mOffsetKudos, true).enqueue(new Callback<String>() { @Override public void onResponse(Call<String> call, Response<String> response) { if (response.isSuccessful()) { PhotoParser JSON = new PhotoParser(); try { mOffsetKudos = mOffsetKudos + 20; resolve.run(JSON.photosFromJson(response.body())); } catch (JSONException e) { Log.e("fetchKudos", e.toString()); } } else { reject.run(new HttpError(response.code(), response.message())); } } @Override public void onFailure(Call<String> call, Throwable t) { reject.run(new HttpError(YPErrorType.Undefined.getType(), t.getMessage())); } }) ); } 

    Actividad o Fragmento:

     private void loadPhoto() { new PhotoService().fetchKudos() .success(this::resultSucceeded) .error(this::resultError); } private void resultSucceeded(List<Photo> photos) { mPhotoAdapter.setItems(photos); } private void resultError(HttpError httpError) { httpErrorToast(httpError); } 

    Si desea utilizar Promizer: Haga clic aquí

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.