SQLite
 sql >> डेटाबेस >  >> RDS >> SQLite

IntentService मेरे एप्लिकेशन UI को फ्रीज कर रहा है

क्या आप पूरी तरह से आश्वस्त हैं कि यह IntentService है यूआई फ्रीज का मूल कारण यही है? मुख्य (यूआई) थ्रेड से प्रोसेसिंग को ऑफलोड करने के लिए इंटेंट सेवाओं को विशेष रूप से वर्कर थ्रेड में चलाने के लिए डिज़ाइन किया गया है, इसका एक मुख्य कारण रोकना में मदद करना है। UI फ़्रीज़ हो जाता है।

शायद UI स्तर पर अपने डिबगिंग प्रयासों को प्रारंभ करने का प्रयास करें। विशेष रूप से, क्या प्रदान करता है ResultReceiver IntentService . के लिए जब आप इसे शुरू करते हैं, और onReceiveResult में आप क्या करते हैं? उस रिसीवर इंस्टेंस में कॉलबैक विधि?

इसके अलावा, जिस गतिविधि में आप फ़्रीज़ का अनुभव कर रहे हैं, उसके लिए जांचें कि आप किस प्रकार के ऑपरेशन कर रहे हैं। मुख्य थ्रेड पर डेटाबेस से बड़ी मात्रा में डेटा लोड हो रहा है (यानी Loader का उपयोग किए बिना या वर्कर थ्रेड में प्रोसेसिंग को ऑफलोड करने के समान कुछ) यूआई फ्रीज का एक सामान्य कारण है, कम से कम मेरे अब तक के अनुभव में।

अपडेट करें

मुझे लगता है कि मैंने काम किया है कि समस्या क्या है। आप वॉली का उपयोग कैसे कर रहे हैं, इससे दो मुख्य मुद्दे हैं। जब आप वॉली कतार में एक अनुरोध जोड़ते हैं, तो इसे अतुल्यकालिक रूप से निष्पादित किया जाता है। इसका मतलब है कि queue विधि तुरंत लौट आती है। आपके इंटेंट सर्विस कोड में, इसका मतलब है कि सेवा तुरंत ResultReceiver को बताएगी। कि उसने प्रसंस्करण समाप्त कर दिया है, जब वास्तव में उसने जो कुछ किया है वह अनुरोध को कतारबद्ध करता है। सभी पाँच इंटेंट सेवाएँ ऐसा करेंगी, जिसका अर्थ है कि MainActivity अतिशीघ्र दर्ज किया जाएगा। यह पहला मुद्दा है।

दूसरा अंक आपके द्वारा अनुभव किए जा रहे फ़्रीज़ की व्याख्या करता है। हालांकि वॉली वर्कर थ्रेड्स पर अनुरोधों को निष्पादित करता है, यह मुख्य थ्रेड पर अनुरोधों के लिए पार्स की गई प्रतिक्रियाएँ देता है - दस्तावेज़ीकरण यहाँ देखें। इसका मतलब यह है कि सभी प्रतिक्रिया प्रसंस्करण जो आप इरादा सेवा में कर रहे हैं (डेटा को डेटाबेस में डालना, आदि) वास्तव में मुख्य (यूआई) थ्रेड पर हो रहा है। यह ठंड की व्याख्या करता है।

आप शायद यहां जो करना चाहते हैं, वह वॉली के RequestFuture . का उपयोग करने के लिए स्विच ओवर है बजाय। यह मूल रूप से एक एसिंक्रोनस अनुरोध को एक सिंक्रोनस में बदल देता है जिससे आप अनुरोध समाप्त होने तक ब्लॉक कर सकते हैं। ऐसा करने के लिए, उपयुक्त प्रकार का भविष्य बनाएं (JSONObject आपके मामले में) और इसे अनुरोध के लिए श्रोता और त्रुटि श्रोता दोनों के रूप में सेट करें। फिर, अनुरोध को कतारबद्ध करें जैसा कि आप अभी करते हैं, और इसके तुरंत बाद कॉल करें get भविष्य पर विधि। यह विधि तब तक अवरुद्ध रहेगी जब तक प्रतिक्रिया का प्रसंस्करण समाप्त नहीं हो जाता। इसे इंटेंट सर्विस में करना ठीक है क्योंकि यह वर्कर थ्रेड पर चलता है, UI थ्रेड पर नहीं।

यदि अनुरोध सफल होता है तो आपको डेटा वापस मिल जाएगा और आप उन सभी तर्कों को निष्पादित कर सकते हैं जो वर्तमान में आपके Response.Listener में हैं। कार्यान्वयन। यदि कोई त्रुटि होती है (अर्थात किसी कारण से अनुरोध विफल हो जाता है), तो अनुरोध भविष्य में एक अपवाद होगा जिसे आप कोई भी उचित कार्रवाई करने के लिए संभाल सकते हैं।

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

आशा है कि यह मदद करता है, और बग को पहले न उठाने के लिए मेरी ईमानदारी से क्षमा याचना।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. टेक्स्ट फ़ाइल में SQLite क्वेरी परिणाम सहेजें

  2. डेटाबेस '/data/data/msv_database.db' के लिए कनेक्शन पूल कनेक्शन देने में असमर्थ रहा है। कनेक्शन:0 सक्रिय, 1 निष्क्रिय, 0 उपलब्ध

  3. SQLite त्रुटि में एकाधिक पंक्तियाँ सम्मिलित करें (त्रुटि कोड =1)

  4. SQLite में डुप्लिकेट पंक्तियों को हटाने के 2 तरीके

  5. एक पूर्व-आबादी वाला डेटाबेस एपीआई 28 पर काम नहीं करता है, ऐसा कोई टेबल अपवाद नहीं फेंकता है