2017-04-03 6 views
8

RxJava、Retrofit、Multi-Windowモードに問題があります... アクティビティ内でRetrofitで独自のAPIを呼び出していますこれよりも複雑な少し):アプリは「ノーマル」モード(フルスクリーン)ですべてが正常に動作した場合マルチウィンドウモードに入るときに異常なライフサイクルコールバックが発生する

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

...私は、BGにアプリを入れて前面に戻ってそれを置くことができますAPIコールメソッドが再び呼び出されます(これはonResumeメソッドにあります)。UIは問題なく描画されます。 マルチウィンドウモードをアクティブにすると、代わりに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) 

アプリがクラッシュしませんが、UIは、「プレースホルダ」状態のままとロードプログレスバーは永遠なります。

EDIT:私は他のアクティビティでも同じコード構造を持っています。しかし、問題はどこにも現れません。

+0

要求を実行するときにフォーカスウィンドウを変更しますか? – azizbekian

+0

いいえ...コードは同じです...電話で唯一のことは、私がアクティビティにいるときにマルチウィンドウモードをアクティブにすることです。 – nicopasso

答えて

1

アプリがマルチウィンドウモードに入ると、ちょっと変わったライフサイクルコールバックシーケンスが発生します。 onStartonResume、、onStopを記録しました。結果を参照してください:

enter image description here

pause 
stop 
start 
resume 
pause 

だから、最初は最初のアプリは、フォーカスを失った後、それがフォーカスを取得して、後でそれが(フォーカスが次のウィンドウに行く)、再びフォーカスを失った開かれました。

で購読を停止していると私はonResumeで購読を開始しました。そのため、subscribe()はすぐに登録解除されているので、決して呼び出されません。

+0

いいキャッチ!それが問題の原因でした...私は 'onPause'メソッドの外でSubscription' unsubscribe'メソッドを移動しなければなりませんでした – nicopasso

関連する問題