RxAndroid & Retrofit Mejor aproximación para el manejo de errores
Tengo algunas dudas sobre un enfoque que estoy intentando implementar en una aplicación para Android.
Los servicios de la aplicación pueden enviar un código de error http cuando un usuario ha perdido su sesión o ha caducado.
- ¿Cómo utilizar Flowable en RxJava 2?
- Inter fragmento de comunicación utilizando rxjava
- Java.lang.NoClassDefFoundError: io.reactivex.Observable
- RxAndroid, bus de eventos y ciclo de vida de la actividad
- Comprensión de flujos de datos y múltiples suscriptores (con retroadaptación)
Ya que soy nuevo en RxAndroid tengo dudas sobre cómo implementar una forma genérica de manejarlo con un observable genérico.
Las llamadas al servidor pueden realizarse en una clase Presenter o Manager y la idea es notificar la actividad.
Sería un buen enfoque para utilizar Rx Android como el autobús de eventos para notificar cuando el servidor envía este error?
La idea es que cada actividad se suscriba a escuchar los errores, y en caso de que obtengamos una excepción HttpException podríamos comunicarnos con la actividad usando RxAndroid como Event Bus?
- El tipo de retorno observable debe parametrizarse como Observable <Foo> o Observable <? Se extiende Foo>
- La llamada a la API de Retrofit recibe "HTTP FAILED: java.io.IOException: Cancelled"
- Cancelación de varias suscripciones a la vez en RxAndroid - Android
- Observable vs. Servicio en Android
- RxJava onCompleted y onTerminate en el hilo principal
- Retrofit con Rxjava Schedulers.newThread () vs Schedulers.io ()
- Cómo actualizar la interfaz de usuario desde el servicio de Android utilizando RxJava / RxAndroid
- Obtenga el código de estado de la respuesta utilizando Retrofit 2.0 y RxJava
Aquí está la solución para usted. Funcionará bajo la suposición de que Dagger 2 se implementará correctamente. Cuanto antes lo hagas, mejor para ti.
Cree una clase Singleton SampleDAO (Google DAO patrón Android). Esta clase será responsable de realizar la solicitud del API. Inyecte esta clase dentro del servicio o donde quiera y realice la solicitud de API a través de la estimulación del objeto performRequest como este – sampleDao.performRequest (). OnNext (null);
import android.support.annotation.NonNull; import javax.inject.Singleton; import rx.Observable; import rx.Observer; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Func1; import rx.schedulers.Schedulers; import rx.subjects.PublishSubject; @Singleton public class SampleDao { @NonNull PublishSubject<Object> performRequest = PublishSubject.create(); @NonNull Observable<SomeData> apiResponse; public SampleDao(final @NonNull ApiService apiService) { apiResponse = performRequest .switchMap(new Func1<Object, Observable<SomeData>>() { @Override public Observable<SomeData> call(Object o) { return apiService.apiRequest() .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()); } }); } @NonNull public Observable<SomeData> getApiResponse() { return apiResponse; } @NonNull public Observer<Object> performRequest() { return performRequest; } }
Tienes que crear presentador también. En este pasador pasar SampleDao como una referencia al constructor (Dagger 2 manejar esto).
import android.support.annotation.NonNull; import rx.Observable; public class SamplePresenter { @NonNull private final Observable<SomeData> someDataObservable; public SamplePresenter(SampleDao sampleDao) { someDataObservable = sampleDao.getApiResponse(); } @NonNull public Observable<SomeData> getSomeDataObservable() { return someDataObservable; } }
Inyectar presentador en la Actividad / Fragmento en el que desea manejar la respuesta o el error.
import android.os.Bundle; import android.widget.Toast; import com.trello.rxlifecycle.components.RxActivity; import javax.inject.Inject; import rx.Subscriber; public class MainActivity extends RxActivity { @Inject SamplePresenter samplePresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); samplePresenter.getSomeDataObservable() .compose(this.<SomeData>bindToLifecycle()) .subscribe(new Subscriber<SomeData>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { final ErrorHelper errorHelper = new ErrorHelper(getResources(), e); Toast.makeText(MainActivity.this, errorHelper.getErrorMessage(), Toast.LENGTH_SHORT).show(); } @Override public void onNext(SomeData someData) { } }); } }
- ¿Cómo realizar un seguimiento de las notificaciones push de FCM enviar el formulario al lado del servidor o Rest Client?
- Los elementos de pestaña inflados en Tab Layout no coinciden con parent en android