एंड्रॉइड में Handler - सही उपयोग और आधुनिक विकल्प
Handler एक लूपर से जुड़े थ्रेड पर चलने के लिए Runnable/Message को एनक्यू करता है। सामान्य उपयोग: मुख्य थ्रेड पर UI अपडेट शेड्यूल करना, विलंबित कार्य, या बैकग्राउंड थ्रेड से मुख्य थ्रेड पर पोस्ट करना।
मुख्य थ्रेड Handler (सबसे आम)
// गतिविधि/फ्रैगमेंट/व्यू में
private final Handler mainHandler = new Handler(Looper.getMainLooper());
// 2 सेकंड बाद चलाएं
mainHandler.postDelayed(() -> {
textView.setText("अपडेट किया गया!");
}, 2000);
// बैकग्राउंड थ्रेड से मुख्य थ्रेड पर पोस्ट करें
ExecutorService bg = Executors.newSingleThreadExecutor();
bg.execute(() -> {
String result = heavyWork();
mainHandler.post(() -> uiTextView.setText(result));
});
Handler निर्माण - सर्वोत्तम अभ्यास
| कंस्ट्रक्टर | उपयोग-मामला |
|---|---|
new Handler(Looper.getMainLooper()) | मुख्य थ्रेड पर पोस्ट करें (API 30+ स्पष्ट) |
new Handler(Looper.myLooper()) | वर्तमान थ्रेड के लूपर पर पोस्ट करें (यदि लूपर तैयार है) |
new Handler(backgroundLooper) | समर्पित बैकग्राउंड थ्रेड पर पोस्ट करें |
new Handler() (नो-आर्ग) | डिप्रिकेट — निहित लूपर भ्रम पैदा करता है |
जीवनचक्र-संवेदनशील सफाई
@Override
protected void onDestroy() {
super.onDestroy();
mainHandler.removeCallbacksAndMessages(null); // लीक/क्रैश रोकें
}
या ViewModel + viewModelScope (कोरआउटिन) का उपयोग करें जो स्वचालित रूप से रद्द हो जाता है।
आधुनिक विकल्प (Handler को प्राथमिकता दें)
| API | उपयोग-मामला | लाभ |
|---|---|---|
viewModelScope.launch { delay(2000); updateUI() } | ViewModel में विलंबित UI कार्य | जीवनचक्र-जागरूक, स्वचालित रद्दीकरण, संरचित समवर्तीता |
| जीवनचक्र-जागरूक कोरआउटिन | केवल तब चलता है जब जीवनचक्र STARTED हो | |
Handler(Looper.getMainLooper()).postDelayed | त्वरित एक-ऑफ UI विलंब | सरल, कोई कोरआउटिन सेटअप नहीं |
WorkManager | स्थायी/पृष्ठभूमि कार्य (सिंक, अपलोड) | डोज़/स्टैंडबाई से बचता है, पुनः प्रयास नीति |
RxJava Observable.timer | रिएक्टिव स्ट्रीम में विलंब | कंपोजेबल, बैकप्रेशर |
मूल उदाहरण की समीक्षा
मूल कोड एक Timer + TimerTask + आंतरिक Handler + runOnUiThread + एक और लीक होने वाला Timer ऑब्जेक्ट बनाता था — अत्यधिक जटिल और लीक-प्रवण। एक एकल Handler (या कोरआउटिन) पर्याप्त है।
सारांश
- मुख्य-थ्रेड UI विलंब/पोस्ट के लिए
Handler(Looper.getMainLooper())का उपयोग करें। onDestroyमेंremoveCallbacksAndMessages(null)के साथ हमेशा साफ करें।- नए कोड के लिए, **कोरआउटिन + viewModelScope/lifecycleScope** को प्राथमिकता दें — वे सुरक्षित, पठनीय और जीवनचक्र-जागरूक हैं।
- दोहराने वाले UI कार्यों के लिए
Timerका उपयोग न करें;Handler.postDelayedयाPeriodicWorkRequestका उपयोग करें।