2010-05-08 10 views
13

मेरे पास एक थ्रेड है जिसका उपयोग मैं समय-समय पर अपनी गतिविधि में डेटा को अद्यतन करने के लिए करता हूं। मैं धागा बना देता हूं और postDelay() के साथ एक हैंडलर का उपयोग करने के लिए एक लूपर शुरू करता हूं। मेरी गतिविधि के लिए ऑनस्ट्रोय() में, मैं अपने हैंडलर पर removeCallbacks() को कॉल करता हूं।एंड्रॉइड: लूपर छोड़ना?

क्या मुझे handler.getLooper().quit() पर कॉल करना चाहिए? या इसके बारे में चिंता न करें और ओएस को इसके साथ सौदा करने दें? या फिर सीपीयू चक्रों का उपभोग करने के बाद यह हमेशा के लिए दौड़ जाएगा?

उत्तर

0

अब मैं सही उत्तर नहीं देता लेकिन इंटरनेट पर कई दस्तावेज और ट्यूटोरियल्स का निर्णय लेता हूं, उनमें से कोई भी हैंडलर को कॉल नहीं करता है .getLooper()। छोड़ें()। तो मुझे लगता है कि यह स्पष्ट रूप से करने के लिए आवश्यक नहीं है।

लेकिन अगर आप सिर्फ अपने OnDestroy() विधि को यह एक लाइनर जोड़ने वहाँ वास्तव में कोई खामी है?

+3

कुछ प्रोसेसर चक्र के अलावा अन्य किसी खामी:

यहाँ Looper.java से प्रासंगिक अनुभाग हैं। लेकिन मुझे यह समझना अच्छा लगता है कि सिस्टम दृश्यों के पीछे कैसे काम कर रहा है। – stormin986

16

Android Documentation के अनुसार आपको छोड़ने() को कॉल करना चाहिए।

जब आप Looper.loop() फोन थोड़ी देर के पाश शुरू कर दिया है। कॉलिंग Looper.quit() लूप को समाप्त करने का कारण बनता है। लूप कन्वर्टर आपके ऑब्जेक्ट को एकत्र नहीं कर सकता है जबकि लूप निष्पादित हो रहा है।

public static final void loop() { 
    Looper me = myLooper(); 
    MessageQueue queue = me.mQueue; 
    while (true) { 
     Message msg = queue.next(); // might block 
     //if (!me.mRun) { 
     // break; 
     //} 
     if (msg != null) { 
      if (msg.target == null) { 
       // No target is a magic identifier for the quit message. 
       return; 
      } 
      if (me.mLogging!= null) me.mLogging.println(
        ">>>>> Dispatching to " + msg.target + " " 
        + msg.callback + ": " + msg.what 
        ); 
      msg.target.dispatchMessage(msg); 
      if (me.mLogging!= null) me.mLogging.println(
        "<<<<< Finished to " + msg.target + " " 
        + msg.callback); 
      msg.recycle(); 
     } 
    } 
} 

public void quit() { 
    Message msg = Message.obtain(); 
    // NOTE: By enqueueing directly into the message queue, the 
    // message is left with a null target. This is how we know it is 
    // a quit message. 
    mQueue.enqueueMessage(msg, 0); 
} 
+1

मैं पुष्टि कर सकता हूं कि यह काम करता है। –