2010-09-14 11 views
17

मान लीजिए कि मेरे पास कुछ सामान करने के लिए थ्रेड लॉन्च करने के लिए मेरे सेवा के ऑनस्टार्ट() हैंडलर में कोड है और फिर stopSelf() को कॉल करें।थ्रेड चल रहा है, जबकि सेवा में कॉलिंग रोकें()

स्टॉपसेल्फ() थ्रेड खत्म होने से पहले कॉल किया जाता है। वास्तव में क्या होता है?

मैंने इसे स्वयं से जांच लिया है और मेरा धागा इसे समाप्त होने तक निष्पादित करना जारी रखता है। क्या एंड्रॉइड स्टॉपसेल्फ() कॉल सुनता है, लेकिन थ्रेड समाप्त होने तक इसे स्थगित कर देता है?

@Override 
public void onStart(Intent intent, int startid) { 
    new Thread(new Runnable() { 
     public void run() { 
     // TODO some long running operation 
     } 
    }).start(); 
    stopSelf(); 
} 
+1

कृपया कुछ कोड पोस्ट करें ... – Kiril

+1

यहां तक ​​कि कोड का छोटा सा हिस्सा भी मदद करता है ... मल्टीथ्रेडिंग के कारण निष्पादन का आदेश स्पष्ट रूप से लागू नहीं होता है, इसलिए स्वीकृत उत्तर इंगित करता है: आप थ्रेड + संदर्भ "लीक" कर रहे हैं सेवा के लिए। – Kiril

+0

क्या आप थ्रेड लॉन्च करने के लिए 'ऑनस्टार्ट' के बजाय 'ऑनस्टार्ट कमांड' का उपयोग नहीं करना चाहिए? –

उत्तर

21

stopSelf() धागा खत्म होने से पहले कहा जाता हो जाता है। वास्तव में क्या होता है?

धागा पूरा होने के लिए चलाता है।

क्या एंड्रॉइड स्टॉपसेल्फ() कॉल सुनता है, लेकिन थ्रेड समाप्त होने तक इसे स्थगित कर देता है?

नहीं। ServicestopSelf() कॉल के बिंदु पर अभी भी नष्ट हो गया है। आप थ्रेड को समाप्त होने तक कम से कम एक थ्रेड और Service ऑब्जेक्ट लीक कर रहे हैं।

आप IntentService पर स्विच करने पर विचार करना चाहेंगे, क्योंकि यह पृष्ठभूमि-थ्रेड-और -पैटर्न को एकीकृत करता है।

+2

इसलिए, यदि मैं इसे सही ढंग से समझता हूं, तो एक IntentService कोड को हैंडलइन्टेंट पर थ्रेड में निष्पादित करेगा; इसलिए मुझे अपने कोड के साथ कोई थ्रेडिंग करने की आवश्यकता नहीं है। साथ ही, कोड समाप्त होने पर IntentService खुद को मार देगा। यदि कोई अन्य इरादा IntentService को पास किया जाता है, तो यह निष्पादन पूरा होने पर उस इरादे को संभालेगा। जब सब खत्म हो जाए, तो वह खुद को मार देता है। IntentService के बाहर, मुझे बस इतना करना है कि मेरे इरादे से कॉल स्टार्ट सेवा है। हाँ? – Andrew

+0

क्या कतार के सामने एक इरादा को मजबूर करने का कोई तरीका है? इन कार्यों को क्यूइंग करना ज्यादातर समय ठीक है, लेकिन कहें कि मैं इरादा सेवा को डेटा खींचने के लिए एक वेब सेवा हिट करना चाहता हूं। मैं चाहता हूं कि कतार में सबकुछ कूदें और तुरंत हो जाएं। यूआई थ्रेड जमे हुए नहीं हो सकता है, लेकिन उपयोगकर्ता अभी भी उस डेटा पर इंतजार कर रहा है। – Andrew

+2

@ एंड्रयू: "हां?" -- हाँ। "क्या कतार के सामने एक इरादा को मजबूर करने का कोई तरीका है?" - ऐसा नहीं है कि मुझे पता है, हालांकि आप कतार को 'प्राथमिकता क्यूयू' के साथ किसी भी तरह से बदलने में सक्षम हो सकते हैं। आईआईआरसी, 'इराद सेवा' एक बहुत बड़ी कक्षा नहीं है, इसलिए आप शायद अपनी जरूरतों को पूरा करने के लिए कतार कार्यान्वयन को ट्यून करने के लिए इसे क्लोन कर सकते हैं। मेरे अनुभव से – CommonsWare

1

यदि आप थ्रेड के अंदर से स्वयं को() कहते हैं। जब भी आप सेवा बंद करना चाहते हैं तो आप थ्रेड में किसी भी बिंदु पर stopSelf() को कॉल कर सकते हैं। लेकिन फिर भी धागा चलना जारी रहेगा। यदि आप थ्रेड पूर्ण होने पर बंद होने के लिए सेवा चाहते हैं तो अपने थ्रेड की अंतिम पंक्ति पर stopSelf() को कॉल करें।

+0

एक थ्रेड (एंड्रॉइड 4.2.2) के भीतर stopSelf() को कॉल करते समय एक सेवा बंद नहीं होती है। एक Asynctask का बेहतर उपयोग करें और रद्द करें स्वयं को रद्द या ऑनस्टोएक्सक्यूट पर कॉल करें। –

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