टिमर्टस्क या हैंडलर


103

मान लीजिए कि मैं हर 10 सेकंड में कुछ कार्रवाई करना चाहता हूं और यह जरूरी नहीं है कि दृश्य को अपडेट किया जाए।

सवाल यह है कि क्या टाइमर का उपयोग करना बेहतर है (मेरा मतलब है कि अधिक कुशल और प्रभावी है) टाइमर का उपयोग यहां की तरह करें:

final Handler handler = new Handler();

TimerTask timertask = new TimerTask() {
    @Override
    public void run() {
        handler.post(new Runnable() {
            public void run() {
               <some task>
            }
        });
    }
};
timer = new Timer();
timer.schedule(timertask, 0, 15000);
}

या बस एक हैंडलर पोस्टडेलैयड के साथ

final Handler handler = new Handler(); 
final Runnable r = new Runnable()
{
    public void run() 
    {
        <some task>
    }
};
handler.postDelayed(r, 15000);

इसके अलावा, मैं आभारी रहूंगा यदि आप बता सकते हैं कि कब किस दृष्टिकोण का उपयोग करना है और क्यों उनमें से एक दूसरे की तुलना में अधिक कुशल है (यदि यह वास्तव में है)।


2
मैंने टाइमर पोस्ट के अनियमित व्यवहार के बारे में कई पोस्ट पढ़े हैं। मेरी सलाह उनके बारे में स्पष्ट होगी और हैंडलर / पोस्टडेलिड दृष्टिकोण का उपयोग करेगी।
साउंड कंसेप्शन

1
मैं हैंडलर-पोस्टडेल विधि को पसंद करूंगा - आपके पास अधिक नियंत्रण है और आप इसे अंदर से शेड्यूल करते हैं
mihail


TimerTask एक बैकग्राउंड-टास्क है, जिससे आप UI को अपडेट नहीं कर सकते हैं। बस कह रहा हूँ ...
Yousha Aleayoub

1
मेरे लिए काम किया..धन्यवाद
jyotsna

जवाबों:


96

Handlerसे बेहतर है TimerTask

जावा TimerTaskऔर एंड्रॉइड Handlerदोनों आपको पृष्ठभूमि थ्रेड्स पर विलंबित और दोहराया कार्यों को शेड्यूल करने की अनुमति देते हैं। हालाँकि, साहित्य एंड्रॉइड में Handlerओवर का उपयोग करने की अनुशंसा करता TimerTaskहै ( यहां देखें , यहां , यहां , यहां , यहां और यहां देखें )।

टाइमर के साथ रिपोर्ट की गई कुछ समस्याओं में शामिल हैं:

  • UI थ्रेड को अपडेट नहीं किया जा सकता
  • स्म्रति से रिसाव
  • अविश्वसनीय (हमेशा काम नहीं करता है)
  • लंबे समय से चल रहे कार्य अगले शेड्यूल किए गए इवेंट में हस्तक्षेप कर सकते हैं

उदाहरण

सभी प्रकार के एंड्रॉइड उदाहरणों के लिए सबसे अच्छा स्रोत जो मैंने देखा है वह कोडपाथ पर हैHandlerएक दोहराए जाने वाले कार्य के लिए यहां एक उदाहरण दिया गया है।

// Create the Handler object (on the main thread by default)
Handler handler = new Handler();
// Define the code block to be executed
private Runnable runnableCode = new Runnable() {
    @Override
    public void run() {
      // Do something here on the main thread
      Log.d("Handlers", "Called on main thread");
      // Repeat this the same runnable code block again another 2 seconds
      handler.postDelayed(runnableCode, 2000);
    }
};
// Start the initial runnable task by posting through the handler
handler.post(runnableCode);

सम्बंधित


6
@ रिक नं, जीसी को इसका ध्यान रखना चाहिए। लेकिन आपको विलंबित निष्पादन के लिए रननीय पोस्ट की देखभाल करने की आवश्यकता है। उपयोग किए जा सकने वाले उपर्युक्त उदाहरण में एक आंतरिक वर्ग उदाहरण है, जिसमें शामिल वर्ग (जो एक गतिविधि हो सकती है) का एक निहित संदर्भ है। रनर हैंडलर से जुड़े लूपर्स के मैसेज कतार में तब तक रहेगा जब तक कि उसका अगला निष्पादन समय संदर्भ के अमान्य होने के बाद हो सकता है और जिसमें क्लास का उदाहरण लीक हो सकता है। आप mHandler.removeCallbacks(runnableCode)उचित समय (जैसे onStop()किसी गतिविधि के लिए) का उपयोग करके ऐसे संदर्भों को साफ़ कर सकते हैं ।
17'17

7
संदर्भों को प्रस्तुत करने का सबसे अच्छा तरीका !!! (यहां, यहां, यहां, यहां, यहां और यहां देखें)।
इविवि इवाडू

और क्या होगा अगर मैं एक ViewModel के अंदर का उपयोग करना चाहता हूं? वहाँ Android चीजें नहीं होने के आदर्श के खिलाफ नहीं है?
15

@desgraci, मैंने एक ViewModel का उपयोग नहीं किया है, लेकिन प्रलेखन से मैं केवल यह देखता हूं कि यह कहता है कि ViewModel को पदानुक्रम तक नहीं पहुंचना चाहिए या इसमें गतिविधि या फ़्रैगमेंट का संदर्भ नहीं होना चाहिए। मुझे "एंड्रॉइड चीजें" सामान्य रूप से मना करने पर कुछ भी दिखाई नहीं देता है।
सूरगछ

आज के रूप में वे संदर्भ मेरे लिए पुराने हैं और सूचनात्मक रूप से पर्याप्त नहीं हैं। यदि आप अपने कोड को बुरी तरह से प्रोग्राम करते हैं तो वे 4 सूचीबद्ध कमियां केवल वास्तविक हैं। यदि आप समय-समय पर पृष्ठभूमि में कुछ चलाना चाहते हैं और अंततः कुछ स्थिति लागू होती है तो UIThread पर कुछ चलाना चाहते हैं, फिर भी टाइमर एक बहुत अच्छा विकल्प है।
डेविड

18

टाइमर का उपयोग करने के कुछ नुकसान हैं

यह कार्यों को निष्पादित करने के लिए केवल एक ही धागा बनाता है और यदि किसी कार्य को चलाने में बहुत लंबा समय लगता है, तो अन्य कार्यों को नुकसान होता है। यह कार्यों और थ्रेड द्वारा फेंके गए अपवादों को संभालता नहीं है, बस समाप्त हो जाता है, जो अन्य अनुसूचित कार्यों को प्रभावित करता है और वे कभी भी नहीं चलते हैं

से कॉपी किया गया:

TimerTask vs Thread.sleep vs Handler postDelayed - हर एन मिलीसेकंड पर फ़ंक्शन को कॉल करने के लिए सबसे सटीक है?


6
तो एक-शॉट कार्य के बारे में क्या? ऐसा लगता है कि शायद टाइमर इसके लिए बेहतर है क्योंकि आपके पास संदेश कतार का ओवरहेड नहीं है?
माइकल

2
मुझे लगता है कि हम कभी नहीं जान पाएंगे
डेनी

6

स्वीकृत उत्तर का कोटलिन संस्करण:

val handler = Handler()

val runnableCode = object : Runnable {
    override fun run() {
       Log.d("Handlers", "Called on main thread")
       handler.postDelayed(this, 2000)
    }
}

handler.post(runnableCode)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.