java - क्यों चलने योग्य कॉलबैक स्वचालित रूप से गतिविधि को नष्ट कर रहा है?




android android-activity (6)

मैं जानना चाहता था कि क्या एक संभावना है कि हम एंड्रॉइड पर देरी के साथ postDelayed कॉलबैक को संभाल सकते हैं?

उदाहरण के लिए, मेरे पास एक या कई स्प्शस्क्रीन (जो हैंडलर. handler.postDelayed(new Runnable()... साथ चलती है) मेरे आवेदन पर (परीक्षण प्रयोजन के लिए एप्लिकेशन)। इस एप्लिकेशन में मेरे पास एक पुस्तकालय है (जो मैं बना रहा हूं और प्रयोग कर रहा हूं यह आवेदन में) और कुछ कक्षाएं जो वहाँ उपलब्ध हैं जो एक IntentService वर्ग पर चलता है।

कभी-कभी, जब अनुप्रयोग उन splashscreen क्रियाकलापों ( Testing purpose ) चला रहा है, तो जो लाइब्रेरी मैं बना रहा हूं, वह कुछ गतिविधियों को स्वतः UI में पॉपअप कर सकता है। लेकिन ऐसा प्रतीत होता है कि यदि ये गतिविधियां एक splashscreen गतिविधि पर आती हैं और splashscreen को नष्ट कर दिया जा रहा है, तो उन गतिविधियों (जो कि पॉपअप स्वतन्त्र रूप से) नष्ट हो जाएंगी और लॉककैट में "लीक विंडो" संदेश को लॉन्च किया जाएगा।

समस्या यह है कि :

  • स्वचालित रूप से UI में प्रकट होने वाली ऐसी गतिविधियों को स्वचालित रूप से बंद नहीं किया जाना चाहिए, यह निषिद्ध है। उस गतिविधि को बंद करने के लिए उपयोगकर्ता से एक इंटरैक्शन की आवश्यकता होती है और आवेदन के सामान्य व्यवहार को वापस आती है।
  • साथ ही, पुस्तकालय को एप्लिकेशन के यूआई के बारे में कुछ नहीं पता है।

इसलिए मेरे प्रश्न (लाइब्रेरी पक्ष के लिए अपेक्षाकृत हैं कि मैं यूआई आवेदन के प्रवाह के लिए सूचनाओं के बिना पैदा कर रहा हूँ):

  • क्या यह पता लगाने का एक तरीका है कि क्या कुछ पोस्ट डिलायड पद्धति एप्लिकेशंस में लायब्रेरी पक्ष के अपेक्षाकृत बनाई गई थी? यदि हां, तो मैं इस समस्या को कैसे संभाल सकता हूं?

पुनश्च: सूचना है कि सामान्य रूप से, मैं अनुमान गतिविधि के लिए एक संवाद का उपयोग कर रहा हूं जो स्वचालित रूप से प्रदर्शित हो रहा है

अद्यतन करें

आरेख के स्पष्टीकरण:

अभी मैं एक मामला है कि एक स्पलैशस्क्रीन निष्पादित किया जा रहा है।

आशय सेवा वर्ग को विस्तारित करने वाला वर्ग को इंटरनेट से एक अनुरोध प्राप्त हुआ है जो एक गतिविधि शुरू करेगा।

इस बीच postdelayed पर है, अन्य गतिविधि बनाई गई है और UI में दिखा रहा है जब एक्स सेकंड बीत चुका है और अन्य गतिविधि नष्ट नहीं हुई है, तो अगली गतिविधि बनाई जाती है और अन्य गतिविधि को स्वचालित रूप से नष्ट कर देती है। ऐसा करने में, एंड्रॉइड गतिविधि को अपेक्षाकृत "लीक विंडो" संदेश देता है।


आपको समस्या को बेहतर समझाया जाना चाहिए मैं स्प्लैश स्क्रीन और अन्य गतिविधियों के संबंध में उलझन में हूँ, और अगर समस्या postDelayed() या गतिविधियों के जीवन चक्र से संबंधित है। मैं एक छोटा ग्राफिक आरेख का सुझाव देता हूं जिसमें समझाया गया कि कौन से गतिविधियां अन्य लोगों को लॉन्च करती हैं।

postDelayed() बारे में, सामान्य तौर पर, यदि आप करते हैं

 mHandler.postDelayed(new Runnable() { ... });

आप एक गुमनाम, ताज़ा चलाने योग्य हर पोस्ट कर रहे हैं, इसलिए आप इसे हटाने में सक्षम नहीं होंगे। मैं निम्नलिखित दृष्टिकोण का सुझाव देता हूं, रननबल्स को अपनी लाइब्रेरी में कक्षा सदस्यों के रूप में घोषित कर रहा हूं:

Runnable mLaunchSplashRunnable = new Runnable() { ... };
Runnable mLaunchContactsRunnable = new Runnable() { ... };

.
.

mHandler.postDelayed (mLaunchSplashRunnable, DELAY);
mHandler.postDelayed (mLaunchContactsRunnable, DELAY);

.
.

चूंकि रननाबल्स अब गुमनाम नहीं हैं, आप उन्हें किसी भी समय कतार से हटा सकते हैं:

void removeLibraryDelayedRunnables() {
   mHandler.removeCallbacks(mLaunchSplashRunnable);
   mHandler.removeCallbacks(mLaunchContactsRunnable);
}

नोट करें कि अगर कोई पोस्ट रननबल नहीं है तो पिछली विधि विफल नहीं होगी, इसलिए इसे किसी भी समय कॉल करना सुरक्षित है।

यदि कोई विशिष्ट Runnable कतारबद्ध है, तो एपीआईक मौजूद नहीं है, लेकिन आप शायद एक boolean ध्वज का उपयोग कर सकते हैं, इसे सेट किया जा सकता है जब रननेबल कतारबद्ध है, और जब Runnable चलाया जाता है तो इसे रीसेट करें, एक रननेबल को इंगित करने के लिए लंबित है।

अगर मैं आपकी समस्या को बेहतर समझता हूं तो मैं और अधिक मदद कर सकता हूं।


मुझे लगता है कि आपको कार्यक्रम में तर्क को उलटा देना चाहिए। गतिविधि आपकी गतिविधियों से शुरू होनी चाहिए, न कि सेवा से।

यह हासिल करने के लिए कि आप प्रत्येक गतिविधि https://developer.android.com/reference/android/content/BroadcastReceiver.html के निर्माण पर ब्रॉडकास्ट रिसीवर पंजीकृत कर सकते हैं और सेवा से sendBroadcast का उपयोग कर सकते हैं https://developer.android.com/guide/components /broadcasts.html आवश्यक गतिविधि शुरू करने के लिए प्रसारण रिसीवर को निर्देशित करने के लिए, किसी गतिविधि को प्रारंभ करने की आवश्यकता होती है।


अस्थायी रूप से युग्मित गतिविधि के साथ कॉलबैक का इस्तेमाल करना आपके एसडीके के लिए बहुत अच्छा डिज़ाइन नहीं हो सकता है। नेटवर्क परत से डेटा को एक गतिविधि में प्राप्त करने के लिए अवलोकन का उपयोग करने पर विचार करें जो डेटा की आवश्यकता होती है।

गतिविधि के लिए एक पर्यवेक्षक को जोड़कर डेटा की आवश्यकता होती है, जो यह देखने के लिए देखती है कि क्या नेटवर्क कॉल किया जाता है, आप केवल एक पर्यवेक्षक को डेटा का पर्दाफाश करते हैं जो सक्रिय है। इस तरह, यदि कॉल पूर्ण होने से पहले गतिविधि बंद हो जाती है, तो बंद गतिविधि में डेटा की "धक्का" नहीं है।

यह आपको अपनी लाइब्रेरी के लिए कमजोर संदर्भ बनाने की भी अनुमति देता है, जहां आपको खिड़कियां छिपाने की चिंता नहीं है


आप यह निर्धारित करने के लिए कि क्या आपका स्पलैश स्क्रीन चल रहा है या नहीं, जब आप इसे कॉल करने के बारे में हैं, तो आप स्थिर बूलीयन चर का उपयोग क्यों नहीं करते?


चूंकि हमने अभी तक आपका कोड नहीं देखा है मेरा जवाब बहुत सामान्य होने वाला है, इसलिए उसके लिए खेद है।

मुझे लगता है कि आपको यह देखना है कि क्या उन गतिविधियों को बंद करने पर कोई अपवाद नहीं है, आपको सबसे पहले लॉगकट की जांच करनी चाहिए। अगर इसके बारे में कुछ भी नहीं है बस इसके बारे में सुनिश्चित करने के लिए सभी ब्लॉकों का प्रयास करें। इसलिए जब आप सुनिश्चित कर लें कि यह किसी भी तरह के अपवाद नहीं है, तो गतिविधियों के 'लॉन्च मोड' देखने के लिए AndroidManifest फ़ाइल की जांच करें। यह स्वत: समापन के रूप में अच्छी तरह से नेतृत्व कर सकता है

यदि आपकी सभी गतिविधियां एक मानक मोड में हैं तो इसे बंद करने से पुनः प्रयास करने के लिए कम से कम एक गतिविधि लॉन्च मोड को बदलने का प्रयास करें। यदि यह किसी भी तरह से समझ नहीं आता है, तो समाप्त () कॉल के लिए कोड की जांच करें।

अभी भी कोई भाग्य नहीं है? फिर मुझे लगता है कि यह एएनआर का मामला हो सकता है, आपको मेमोरी लीक की जांच करनी चाहिए, जो आपके आवेदन को जमा देता है और संभवत: गतिविधियों को बंद कर रहा है। संभवतया उन रननेबल आपके आवेदन को बर्बाद कर रहे हैं।

मुझे लगता है कि आपको अपने स्क्रीन के बीच आंतरिक संचार के लिए इवेंटबस या प्रसारण रिसीवर जैसी एक तंत्र होना चाहिए। वे आपकी गतिविधियों के जीवनचक्र पर चलेंगे और किसी भी तरह का अपवाद या अनार नहीं लेंगे।


समस्या यह है कि एक बार जब आप अपने कार्यक्रम में बहुत मेमोरी भस्म हो गए हैं, तो कुछ समय बाद आप एक-एक करके फायरिंग गतिविधियों शुरू करते हैं, इसलिए एंड्रॉइड मानती है कि पिछली गतिविधियों को सिस्टम का अनुकूलन करने के लिए नष्ट किया जा सकता है और डिवाइस को धीमा करने से बचने के लिए, यह कैसे मोबाइल डिवाइस काम करता है , इसलिए आपके प्रमुख गतिविधि जो उपभोक्ता API को सिस्टम द्वारा नष्ट कर दिया गया है: कृपया गतिविधि जीवन चक्र को समझें:

https://developer.android.com/guide/components/activities/activity-lifecycle.html

पर बाद में देखें () ... यह आपके ऐप के साथ मामला है

आशा है कि यह आपकी मदद करेगा...







android-looper