2017-04-03 4 views
8

दर्ज करते समय अजीब लाइफसाइक्ल कॉलबैक ऑर्डर करते हुए मुझे आरएक्सजेवा, रेट्रोफिट और मल्टी-विंडो मोड के साथ समस्या हो रही है ... मैं एक गतिविधि के अंदर रेट्रोफिट के साथ अपना स्वयं का एपीआई कॉल कर रहा हूं (वास्तविक कोड एक है इस तुलना में अधिक जटिल थोड़ा):मल्टी-विंडो मोड

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

एप्लिकेशन "सामान्य" मोड (पूर्ण स्क्रीन) सब कुछ ठीक चलाता है में है ... मैं एप्लिकेशन bg में डाल सकते हैं, अग्रभूमि और करने के लिए इसे वापस रख एपीआई कॉल विधि को फिर से बुलाया जाता है (यह ऑनस्यूम विधि में है - तरह) और यूआई समस्याओं के बिना खींचा जाता है। जब मैं मल्टी-विंडो मोड को सक्रिय करता हूं, इसके बजाए, रेस्यूम पर कॉल किया जाता है, तो एपीआई विधि को सफलता के साथ बुलाया जाता है लेकिन सब्सक्राइब() विधि कभी नहीं पहुंचती है। इस स्थिति के लिए स्टैकट्रेस है:

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 हमेशा के लिए चला जाता है।

संपादित करें: मेरे पास अन्य गतिविधियों में एक ही कोड संरचना है। हालांकि यह मुद्दा कहीं और नहीं दिखाई देता है।

+0

क्या आप अनुरोध करते समय ध्यान केंद्रित विंडो बदलते हैं? – azizbekian

+0

नहीं ... कोड वही है ... फोन पर केवल एक चीज है जो मैं करता हूं कि जब मैं गतिविधि – nicopasso

उत्तर

1

एक ऐप मल्टी-विंडो मोड में प्रवेश करते समय जीवन चक्र कॉलबैक का थोड़ा अजीब अनुक्रम होता है। मैंने onStart, onResume, और onStop लॉग किया है। परिणाम देखें:

enter image description here

pause 
stop 
start 
resume 
pause 

तो, पहले शुरू में खोला एप्लिकेशन, ध्यान खो देता है तो यह ध्यान देने के लाभ और बाद में इसे फिर से ध्यान केंद्रित खो देता है (फोकस अगली विंडो पर चला जाता है)।

मुझे विश्वास है कि आप में सदस्यता छोड़ रहे हैं, क्योंकि आपने onResume में सदस्यता शुरू की है। और यही कारण है कि subscribe() कभी नहीं कहा जाता है, क्योंकि इसे तत्काल सदस्यता समाप्त किया जा रहा है।

+0

गतिविधि में हूं तो बहु-खिड़की मोड को सक्रिय करना है! यह वास्तव में इस मुद्दे का कारण था ... मुझे 'onPause' विधि के बाहर सदस्यता 'सदस्यता रद्द करें' विधि को स्थानांतरित करना पड़ा – nicopasso