Handler() पुराना हो गया: अब क्या? 2025 पर एक नज़र
\n\nयदि आपने कभी Android के लिए कोड लिखा है, तो आपने निश्चित रूप से थ्रेड्स के बीच स्विच करने, विलंबित कार्यों या UI को अपडेट करने के लिए Handler() का उपयोग किया होगा। यह पुराना अच्छा क्लास Android के शुरुआती संस्करणों से हमारे साथ रहा है। लेकिन 2024-2025 में, Google ने आधिकारिक तौर पर Handler() कंस्ट्रक्टर को deprecated (पुराना) घोषित कर दिया। Stack Overflow पर हजारों डेवलपर्स सवाल पूछ रहे हैं: «अब मैं क्या उपयोग करूं जब Handler() पुराना हो गया है?»
इस लेख में, हम समझेंगे कि Handler() क्यों पुराना हो गया, 2025 में Android कौन से विकल्प प्रदान करता है, और सबसे महत्वपूर्ण बात — Kotlin में आधुनिक, स्वच्छ कोड कैसे लिखें जो आपके टीम लीड को परेशान न करे। चलिए शुरू करते हैं!
Handler() deprecated क्यों हुआ?
\n\nHandler क्लास अपने आप में कहीं नहीं गया। केवल बिना आर्गुमेंट वाला कंस्ट्रक्टर (Handler()) और इसके ओवरलोड पुराने हो गए हैं, जो वर्तमान थ्रेड से Looper को अंतर्निहित रूप से बनाते थे। समस्या यह है कि यह व्यवहार:
- \n
- अंतर्निहित और असुरक्षित — यदि आप किसी बैकग्राउंड थ्रेड में
Handler()कॉल करते हैं जिसमेंLooperनहीं है, तो आपकोRuntimeExceptionमिलेगा। \n - परीक्षण को जटिल बनाता है —
Handlerथ्रेड के जीवनचक्र से गहराई से जुड़ा होता है, जिससे यूनिट टेस्ट सिरदर्द बन जाते हैं। \n - नैतिक रूप से पुराना हो गया — अधिक आधुनिक और घोषणात्मक उपकरण सामने आए हैं: कोरूटीन,
HandlerThread(स्पष्ट रूप में) औरLiveData। \n
Google कंस्ट्रक्टर में स्पष्ट रूप से Looper पास करने या विकल्पों का उपयोग करने की सलाह देता है। आइए देखें कि वास्तव में क्या बदलाव आया है।
विकल्प #1: स्पष्ट Looper (सबसे आसान फिक्स)
\n\nयदि आप पूरा कोड फिर से नहीं लिखना चाहते हैं, तो deprecated को हटाने का सबसे तेज़ तरीका Looper को स्पष्ट रूप से पास करना है। मुख्य थ्रेड (UI thread) के लिए Looper.getMainLooper() का उपयोग करें।
// पुराना कोड (deprecated)\nval handler = Handler()\n\n// नया कोड (2025)\nval handler = Handler(Looper.getMainLooper())\n\n// या बैकग्राउंड थ्रेड के लिए:\nval handler = Handler(Looper.myLooper()) // ध्यान दें: null हो सकता है!\n\n\nयह सभी समस्याओं का समाधान नहीं करेगा, लेकिन कंपाइलर की चेतावनी को हटा देगा। हालांकि, गंभीर प्रोजेक्ट्स के लिए कोरूटीन पर स्विच करना बेहतर है।
\n\nविकल्प #2: Kotlin Coroutines (Google द्वारा अनुशंसित)
\n\n2021 से, Google आधिकारिक तौर पर एसिंक्रोनस ऑपरेशन के लिए Kotlin Coroutines की सिफारिश करता है। 2025 में, यह पहले से ही उद्योग मानक है। कोरूटीन Handler से बेहतर क्यों हैं?
- \n
- हल्कापन — हजारों कोरूटीन थ्रेड को ब्लॉक नहीं करते। \n
- संरचित समवर्तीता — जीवनचक्र समाप्त होने पर स्वचालित रद्दीकरण। \n
- पठनीयता — कोड सिंक्रोनस दिखता है, बिना callback-के। \n
- परीक्षण योग्यता — यूनिट टेस्ट के लिए
runBlockingऔरTestCoroutineDispatcher। \n
यहां बताया गया है कि Handler के विशिष्ट कार्यों को कोरूटीन से कैसे बदलें:
postDelayed का प्रतिस्थापन (विलंबित कार्य)
\n\n// Handler के साथ पुराना तरीका\nval handler = Handler(Looper.getMainLooper())\nhandler.postDelayed({\n // 2 सेकंड बाद निष्पादित करें\n}, 2000)\n\n// Coroutines के साथ नया तरीका\nlifecycleScope.launch {\n delay(2000) // थ्रेड को ब्लॉक नहीं करता!\n // 2 सेकंड बाद निष्पादित करें\n}\n\n\npost का प्रतिस्थापन (UI थ्रेड पर स्विच करना)
\n\n// पुराना तरीका\nhandler.post {\n textView.text = "बैकग्राउंड थ्रेड से नमस्ते"\n}\n\n// नया तरीका\nlifecycleScope.launch(Dispatchers.Main) {\n textView.text = "कोरूटीन से नमस्ते"\n}\n\n\nremoveCallbacks का प्रतिस्थापन (कार्य रद्द करना)
\n\n// पुराना तरीका\nval runnable = Runnable { /*...*/ }\nhandler.postD