क्या आप पूरी तरह से आश्वस्त हैं कि यह IntentService
है यूआई फ्रीज का मूल कारण यही है? मुख्य (यूआई) थ्रेड से प्रोसेसिंग को ऑफलोड करने के लिए इंटेंट सेवाओं को विशेष रूप से वर्कर थ्रेड में चलाने के लिए डिज़ाइन किया गया है, इसका एक मुख्य कारण रोकना में मदद करना है। UI फ़्रीज़ हो जाता है।
शायद UI स्तर पर अपने डिबगिंग प्रयासों को प्रारंभ करने का प्रयास करें। विशेष रूप से, क्या प्रदान करता है ResultReceiver
IntentService
. के लिए जब आप इसे शुरू करते हैं, और onReceiveResult
में आप क्या करते हैं? उस रिसीवर इंस्टेंस में कॉलबैक विधि?
इसके अलावा, जिस गतिविधि में आप फ़्रीज़ का अनुभव कर रहे हैं, उसके लिए जांचें कि आप किस प्रकार के ऑपरेशन कर रहे हैं। मुख्य थ्रेड पर डेटाबेस से बड़ी मात्रा में डेटा लोड हो रहा है (यानी Loader
का उपयोग किए बिना या वर्कर थ्रेड में प्रोसेसिंग को ऑफलोड करने के समान कुछ) यूआई फ्रीज का एक सामान्य कारण है, कम से कम मेरे अब तक के अनुभव में।
अपडेट करें
मुझे लगता है कि मैंने काम किया है कि समस्या क्या है। आप वॉली का उपयोग कैसे कर रहे हैं, इससे दो मुख्य मुद्दे हैं। जब आप वॉली कतार में एक अनुरोध जोड़ते हैं, तो इसे अतुल्यकालिक रूप से निष्पादित किया जाता है। इसका मतलब है कि queue
विधि तुरंत लौट आती है। आपके इंटेंट सर्विस कोड में, इसका मतलब है कि सेवा तुरंत ResultReceiver
को बताएगी। कि उसने प्रसंस्करण समाप्त कर दिया है, जब वास्तव में उसने जो कुछ किया है वह अनुरोध को कतारबद्ध करता है। सभी पाँच इंटेंट सेवाएँ ऐसा करेंगी, जिसका अर्थ है कि MainActivity
अतिशीघ्र दर्ज किया जाएगा। यह पहला मुद्दा है।
दूसरा अंक आपके द्वारा अनुभव किए जा रहे फ़्रीज़ की व्याख्या करता है। हालांकि वॉली वर्कर थ्रेड्स पर अनुरोधों को निष्पादित करता है, यह मुख्य थ्रेड पर अनुरोधों के लिए पार्स की गई प्रतिक्रियाएँ देता है - दस्तावेज़ीकरण यहाँ देखें। इसका मतलब यह है कि सभी प्रतिक्रिया प्रसंस्करण जो आप इरादा सेवा में कर रहे हैं (डेटा को डेटाबेस में डालना, आदि) वास्तव में मुख्य (यूआई) थ्रेड पर हो रहा है। यह ठंड की व्याख्या करता है।
आप शायद यहां जो करना चाहते हैं, वह वॉली के RequestFuture
. का उपयोग करने के लिए स्विच ओवर है बजाय। यह मूल रूप से एक एसिंक्रोनस अनुरोध को एक सिंक्रोनस में बदल देता है जिससे आप अनुरोध समाप्त होने तक ब्लॉक कर सकते हैं। ऐसा करने के लिए, उपयुक्त प्रकार का भविष्य बनाएं (JSONObject
आपके मामले में) और इसे अनुरोध के लिए श्रोता और त्रुटि श्रोता दोनों के रूप में सेट करें। फिर, अनुरोध को कतारबद्ध करें जैसा कि आप अभी करते हैं, और इसके तुरंत बाद कॉल करें get
भविष्य पर विधि। यह विधि तब तक अवरुद्ध रहेगी जब तक प्रतिक्रिया का प्रसंस्करण समाप्त नहीं हो जाता। इसे इंटेंट सर्विस में करना ठीक है क्योंकि यह वर्कर थ्रेड पर चलता है, UI थ्रेड पर नहीं।
यदि अनुरोध सफल होता है तो आपको डेटा वापस मिल जाएगा और आप उन सभी तर्कों को निष्पादित कर सकते हैं जो वर्तमान में आपके Response.Listener
में हैं। कार्यान्वयन। यदि कोई त्रुटि होती है (अर्थात किसी कारण से अनुरोध विफल हो जाता है), तो अनुरोध भविष्य में एक अपवाद होगा जिसे आप कोई भी उचित कार्रवाई करने के लिए संभाल सकते हैं।
श्रोताओं का उपयोग करने के लिए अनुरोध वायदा का उपयोग करना काफी अलग तरीका है और इसे काम करने के लिए आपको अपना कोड काफी बदलना पड़ सकता है, लेकिन यह उन मुद्दों को हल करना चाहिए जो आप देख रहे हैं।
आशा है कि यह मदद करता है, और बग को पहले न उठाने के लिए मेरी ईमानदारी से क्षमा याचना।