Tengo un problema con el modo RxJava, Retrofit y Multi-Window... Estoy llamando a nuestra propia API con Retrofit dentro de una actividad (el código real es un poco más complejo que esto):
api.getEvent(...) .subscribeOn(Schedulers.io()) .observeOn(AndroidScheduler.mainThread()) .subscribe(event -> setupUI(event), throwable -> showSnackbar(throwable));Cuando la aplicación está en modo "normal" (pantalla completa), todo funciona bien... Puedo poner la aplicación en bg, ponerla de nuevo en primer plano y se vuelve a llamar al método de llamada api (se encuentra en el método onResume - tipo of) y la interfaz de usuario se dibuja sin problemas. Cuando activo el modo Multiventana, en cambio, se llama a onResume, se llama al método api con éxito pero nunca se alcanza el método subscribe(). El stacktrace para esta situación es:
Retrofit: java.io.InterruptedIOException: thread interrupted at okio.Timeout.throwIfReached(Timeout.java:145) at okio.Okio$1.write(Okio.java:77) at okio.RealBufferedSink.flush(RealBufferedSink.java:221) at com.squareup.okhttp.internal.framed.Http2$Writer.flush(Http2.java:381) at com.squareup.okhttp.internal.framed.FramedConnection.newStream(FramedConnection.java:283) at com.squareup.okhttp.internal.framed.FramedConnection.newStream(FramedConnection.java:249) at com.squareup.okhttp.internal.http.Http2xStream.writeRequestHeaders(Http2xStream.java:135) at com.squareup.okhttp.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:710) at com.facebook.stetho.okhttp.StethoInterceptor.intercept(StethoInterceptor.java:67) at com.squareup.okhttp.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:695) at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:576) at com.squareup.okhttp.Call.getResponse(Call.java:287) at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:243) at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:205) at com.squareup.okhttp.Call.execute(Call.java:80) at com.newrelic.agent.android.instrumentation.okhttp2.CallExtension.execute(CallExtension.java:43) at retrofit.client.OkClient.execute(OkClient.java:53) at com.newrelic.agent.android.instrumentation.retrofit.ClientExtension.execute(ClientExtension.java:42) at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:326) at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220) at retrofit.RestAdapter$RestHandler$1.invoke(RestAdapter.java:265) at retrofit.RxSupport$2.run(RxSupport.java:55) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) at retrofit.Platform$Android$2$1.run(Platform.java:142) at java.lang.Thread.run(Thread.java:761)La aplicación no falla, pero la interfaz de usuario permanece en un estado de "marcador de posición" y la barra de progreso de carga continúa para siempre.
EDITAR: tengo la misma estructura de código en otras actividades. Sin embargo, el problema no aparece en ningún otro lugar.
Hay una secuencia un poco extraña de devoluciones de llamadas del ciclo de vida cuando una aplicación entra en el modo de ventanas múltiples. Inicié sesión onStart , onResume , onPause y onStop . Ver resultados:
pause stop start resume pauseEntonces, la primera aplicación abierta inicialmente pierde el foco, luego gana el foco y luego vuelve a perder el foco (el foco va a la siguiente ventana).
Creo que está cancelando su suscripción en onPause , porque inició la suscripción en onResume . Y es por eso que subscribe() nunca se llama, porque se cancela la suscripción de inmediato.