2012-06-14 19 views
21

मैंने इस विधि का उपयोग करके कुछ पोस्ट पढ़ी हैं, "अच्छा नहीं" है, इसका उपयोग नहीं किया जाना चाहिए, यह एप्लिकेशन को "बंद" करने का सही तरीका नहीं है और यह नहीं है कि एंड्रॉइड कैसे काम करता है ...क्यों Process.killProcess (Process.myPid()) को कॉल करना एक बुरा विचार है?

मैं समझता हूं और तथ्य यह है Android ओएस मुझे की तुलना में बेहतर जानता है कि जब यह सही समय प्रक्रिया समाप्त करने के लिए है, लेकिन मैं अभी तक एक अच्छा स्पष्टीकरण क्यों यह killProcess() विधि का उपयोग करने गलत है नहीं सुना स्वीकार? आखिरकार - यह एंड्रॉइड एपीआई का हिस्सा है ...

मुझे क्या पता है कि इस विधि को कॉल करना जबकि अन्य धागे संभावित रूप से महत्वपूर्ण काम कर रहे हैं (फाइलों पर संचालन, डीबी, HTTP अनुरोध, चल रही सेवाओं को लिखना ..) बीच में समाप्त किया जा सकता है, और यह स्पष्ट रूप से अच्छा नहीं है। इसके अलावा, मैं जानता हूँ कि मैं तथ्य यह है कि "फिर से खुल" आवेदन तेजी से हो जाएगा से लाभ उठा सकते, 'प्रणाली हो सकता है अभी भी कारण "यह मानता है" पिछली बार से स्मृति राज्य में इसका इस्तेमाल किया गया था, और killProcess() कि रोकता है।

इस कारण के अलावा, मुझे लगता है कि मेरे पास ऐसे ऑपरेशन नहीं हैं, और मुझे परवाह नहीं है कि मेरा एप्लिकेशन प्रत्येक रन को खरोंच से लोड करेगा, अन्य कारण हैं कि killProcess() विधि का उपयोग क्यों नहीं कर रहे हैं?

मुझे गतिविधि को बंद करने के लिए खत्म() विधि के बारे में पता है, तो कृपया मुझे इसके बारे में न लिखें .. finish() केवल Activity के लिए है। सभी आवेदनों के लिए नहीं, और मुझे लगता है कि मुझे पता है कि इसका उपयोग क्यों और कब किया जाए ...

और एक और बात - मैं यूनिटी 3 डी ढांचे के साथ भी गेम विकसित कर रहा हूं, और एंड्रॉइड को प्रोजेक्ट निर्यात कर रहा हूं। Process.killProcess(Process.myPid()) साथ Application.quit() विधि, - एकता के लागू करने - जब मैं उत्पन्न apk decompiled, मैं बहुत है कि जावा स्रोत कोड एकता से बनाए गए पता लगाने के लिए आश्चर्यचकित था।

Application.quit() यूनिटी 3 डी गाइड के अनुसार गेम को बंद करने का सही तरीका माना जाता है (क्या यह वास्तव में है? शायद मैं गलत हूं, और कुछ याद किया), तो यह कैसे होता है कि यूनिटी के ढांचे के डेवलपर्स जो बहुत अच्छे काम कर रहे हैं ऐसा लगता है कि यह देशी एंड्रॉइड में killProcess() पर लागू किया गया है?

+0

थ्रेड ऑपरेशंस के संदर्भ में "** अच्छा नहीं **" का क्या मतलब था? –

उत्तर

3

कौन बुला Process.killProcess (Process.myPid()) एक बुरा विचार है कहा?

हाँ, ओएस दे प्रबंधन अपने स्वयं के स्मृति दोनों तुम और उपयोगकर्ता अपने आवेदन का उपयोग कर के लिए सबसे अच्छा अभ्यास है (तेजी से फिर से खोलने के लिए, बल बंद, आदि ... के लिए कम संभावना है)।

हालांकि, आपको यह सुनिश्चित करने के लिए पता है कि आप थ्रेड या अन्य पृष्ठभूमि संचालन में बाधा नहीं डाल रहे हैं और आप इस कॉल का उपयोग onDestroy() में करते हैं - मुझे कोई कारण नहीं दिखता कि आपको इसका उपयोग क्यों नहीं करना चाहिए। खासकर जब यह एक एपीआई कॉल है और कामकाज नहीं है, और Google ने इसका उल्लेख नहीं किया है कि इसे एपीआई दस्तावेज में उपयोग न करें।

+10

"कॉल करने की प्रक्रिया किसने कहा। KillProcess (Process.myPid()) एक बुरा विचार है?" - कोर एंड्रॉइड डेवलपमेंट टीम, विशेष रूप से इंजीनियरों जैसे डियान हैकबर्न और रोमैन गाय। – CommonsWare

+1

@CommonsWare और इसका कारण यह बुरा है? –

+2

यह ढांचे और कोर सिस्टम प्रक्रिया को ऐप की प्रक्रिया (उदाहरण के लिए, कार्य इतिहास) के सापेक्ष अपना स्वयं का सफाई करने से रोकता है। – CommonsWare

9

खैर, Unit3d संभवत: मूल कोड का उपयोग कर रहा है, और वे एक बीमा के रूप में प्रक्रिया की हत्या कर रहे हैं - वे स्मृति रिसाव नहीं करना चाहती। आप तर्क दे सकते हैं कि यह एक अच्छा विचार है या नहीं, लेकिन तथ्य यह है कि उन्होंने इसका इस्तेमाल किया इसका मतलब यह नहीं है कि आपको भी चाहिए।

शायद कुछ चरम मामले हैं जहां आप killProcess() का उपयोग करना चाहते हैं, लेकिन आमतौर पर ओएस वर्तमान लोड और उपयोग के अनुसार आपके लिए यह करता है। सुनिश्चित नहीं है कि आप किस प्रकार का उत्तर ढूंढ रहे हैं - आपको पता है कि killProcess() का उपयोग करके चीजें तोड़ सकती हैं, जब तक कि आप इसका उपयोग उचित न कर सकें, इसका उपयोग न करें।

+0

जैसा कि आपने कहा था, यह वास्तव में वह उत्तर नहीं है जिसे मैं ढूंढ रहा हूं, लेकिन यह निश्चित रूप से एक अप-वोट के लायक है। आपने कुछ दिलचस्प अंक उठाए हैं। –

+0

मुझे लगता है कि यह अधिक संभावना है कि वे अपने मूल संसाधनों को सही तरीके से साफ करने में असमर्थ थे और हत्यारे फिक्स के रूप में killProcess() का उपयोग कर रहे हैं। – safety

+0

~ "killProcess() चीजों को तोड़ सकता है"। किस प्रकार की चीज़ें? –

9

<rant>

एक आदर्श दुनिया में, सही कोड और पुस्तकालयों के साथ, आप Process.killProcess(Process.myPid()) कॉल करने की आवश्यकता नहीं होनी चाहिए और ओएस सही ढंग से अपने आवेदन के रूप में उपयुक्त मार डालेगा। मध्य पूर्व में भी शांति होगी, सूअर उड़ जाएंगे, और halting problem हल हो जाएगा।

क्योंकि ये सभी चीजें अभी तक नहीं हुई हैं, ऐसे समय हैं जब आपको ऐसे 'वर्जित' कोड को निष्पादित करने की आवश्यकता होती है।

हाल ही में एक एंड्रॉइड गेम के लिए मैंने बनाया है, मुफ्त संस्करण एक विज्ञापन लाइब्रेरी का उपयोग करता है जो एप्लिकेशन को जीवित रखेगा और स्मृति को रिसाव भी करेगा। भुगतान किए गए संस्करण में यह समस्या नहीं थी क्योंकि कोई विज्ञापन पुस्तकालय जुड़े नहीं थे। मेरा समाधान मुख्य मेनू पर एक बोली बटन जोड़ना था जो इस तरह के कोड को निष्पादित करता था। मेरी आशा थी कि अधिकांश लोग इस बटन को दबाएंगे और मुझे इसके बारे में चिंता करने की ज़रूरत नहीं है। भुगतान संस्करण मैंने अभी finish() निष्पादित किया था और किया गया था। (यह Google के लिए इन-ऐप खरीद से पहले था, इसलिए मुझे एक भुगतान और मुफ़्त संस्करण बनाना पड़ा, फिर भी उन्होंने इस मुद्दे को अभी तक तय कर लिया होगा और मैं गेम को अपडेट कर सकता हूं लेकिन यह वास्तव में बहुत अच्छा नहीं करता है और मैं संदेह है कि इस पर खर्च किए गए किसी भी समय इसके लायक होंगे)

प्राथमिक/माध्यमिक विद्यालय में इसकी तरह वे आपको बताते हैं कि आप ऋणात्मक संख्या के वर्ग रूट नहीं ले सकते हैं। फिर बाद में एक उच्च स्तरीय बीजगणित कक्षा में वे कहते हैं ... अच्छी तरह से आप ऋणात्मक संख्या के वर्ग रूट ले सकते हैं लेकिन आपको अजीब परिणाम मिलते हैं लेकिन यह लगातार है और समस्या हल करता है।

दूसरे शब्दों में, 'वर्जित' कोड निष्पादित न करें जबतक कि आप यह नहीं जानते कि आप क्या कर रहे हैं।

</rant>

+0

आपके उत्तर से प्यार करता था, लेकिन यह कहने की तरह है कि लियोरी ने पहले से ही अधिक दार्शनिक तरीके से क्या कहा है .. मैंने आपको "इन-ऐप खरीद" कहानी के साथ थोड़ा सा खो दिया है, लेकिन आपका अंतिम मुख्य बिंदु मिला। मैंने आपको अपना अप-वोट दिया है, क्योंकि आपने एक दिलचस्प अंक उठाए हैं .. –

+1

ओएमजी मैंने सोचा कि यह एक टाइपो था, माफ करना दोस्त, अब यह विडंबना है। –

0

यहाँ दो स्थितियों में, जहां killProcess आप काटने और नहीं काम के रूप में वांछित हैं:

1) स्टिकी सेवाएं - वे स्वचालित रूप से पुनः आरंभ करेगा, भले ही आप प्रक्रिया को मार डाला

2) टाइमर - यदि आपने टाइमर पर चलाने के लिए थ्रेड निर्धारित किए हैं, तो वे

को मारने के बाद निष्पादित करना जारी रखेंगे, इसलिए, जैसा कि आप देख सकते हैं, ऐसी परिस्थितियां हैं जहां ** killProcess * आपके चल रहे ऐप को साफ़ करने का एक समझदार समाधान नहीं है।

संबंधित मुद्दे