rxjava android retrofit okhttp rx-android retrofit2

android - retrofit rxjava



Retrofit "IllegalStateException: Ya ejecutado" (1)

Tengo una llamada de red de actualización que a mi id le gusta ejecutar cada 5 segundos. Mi código actual:

Handler h = new Handler(); int delay = 5000; //milliseconds h.postDelayed(new Runnable() { public void run() { call.enqueue(new Callback<ApiResponse>() { @Override public void onResponse(Response<ApiResponse> response) { Log.d("api", "response: " + response.body().getPosition().getLatitude().toString()); } @Override public void onFailure(Throwable t) { } }); h.postDelayed(this, delay); } }, delay);

Esto se ejecuta una vez, pero luego lanza lo siguiente:

java.lang.IllegalStateException: Ya ejecutado. at retrofit2.OkHttpCall.enqueue (OkHttpCall.java:52) at retrofit2.ExecutorCallAdapterFactory $ ExecutorCallbackCall.enqueue (ExecutorCallAdapterFactory.java:57) at orbyt.project.MyFragmentment.

¿Cuál es el problema aquí?

Como beneficio adicional: ¿cuál es una mejor manera de manejar esto? Estaré actualizando un mapa cada actualización. Estaba pensando en intentar usar Rx pero no estoy seguro de si este es un caso de uso apropiado, o cómo implementarlo.


Una Call solo puede usarse una vez. Su documentación te dice cómo usar uno varias veces:

Use clone() para hacer múltiples llamadas con los mismos parámetros al mismo servidor web; Esto se puede usar para implementar el sondeo o para reintentar una llamada fallida.

Por lo tanto, use call.clone().enqueue(..) para Asynchornous y call.clone().execute() Execute call.clone().execute() para Synchornous respectivamente para asegurarse de que tiene una Call nueva y no ejecutada para cada solicitud.