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

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í

  • No se pueden POSTAR datos multipart de retrofit 2
  • Retrofit 2.x: Cabecera de registro para la solicitud y la respuesta
  • InterruptedIOException al usar Retrofit2 con rx cuando retryOn
  • La llamada onNext de PublishSubject en un hilo diferente después de actualizar a Retrofit 2.0
  • Unidad de prueba de la aplicación android con retrofit y rxjava
  • Retrofit indica que existe un token de autenticación cuando se desconecta
  • Cómo obtener una respuesta genérica de Retrofit 2
  • Error de actualización - Falta la dirección URL @GET o el parámetro @Url
  • Retrofit 2 con sólo datos de formulario
  • Retrofit2 Condición de manejar cuando el código de estado 200 pero la estructura de json diferente a la clase de datamodel
  • Renovación de la referencia $ ref de objeto deserializante de JSON a su copia original
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.