Странный порядок обратных вызовов жизненного цикла при входе в многооконный режим

У меня проблема с режимами RxJava, Retrofit и Multi-Window... Я называю наш собственный API с Retrofit внутри Activity (фактический код немного сложнее, чем этот):

api.getEvent(...)
  .subscribeOn(Schedulers.io())
  .observeOn(AndroidScheduler.mainThread())
  .subscribe(event -> setupUI(event),
             throwable -> showSnackbar(throwable));

Когда приложение находится в "нормальном" режиме (полноэкранном режиме), все работает нормально... Я могу поместить приложение в bg, вернуть его на передний план и снова вызвать метод вызова API (он находится в методе onResume - вид из) и пользовательский интерфейс рисуется без проблем. Когда я активирую многооконный режим, вместо этого вызывается onResume, метод api вызывается с успехом, но метод subscribe() никогда не достигается. Трассировка стека для этой ситуации:

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)

Приложение не аварийно завершает работу, но пользовательский интерфейс остается в состоянии "заполнитель", и загрузка ProgressBar продолжается вечно.

РЕДАКТИРОВАТЬ: у меня та же структура кода в других видах деятельности. Проблема не появляется больше нигде, хотя.

1 ответ

Решение

Когда приложение переходит в многооконный режим, происходит несколько странная последовательность обратных вызовов жизненного цикла. Я вошел onStart, onResume, onPause а также onStop, Посмотреть результаты:

pause
stop
start
resume
pause

Итак, сначала изначально открытое приложение теряет фокус, затем оно получает фокус, а затем снова теряет фокус (фокус переходит к следующему окну).

Я полагаю, что вы отписываетесь в onPauseпотому что вы инициировали подписку в onResume, И вот почему subscribe() никогда не вызывается, потому что он немедленно отписался.

Другие вопросы по тегам