तो यहाँ पर विचार करने के लिए कुछ चीजें हैं क्योंकि इस बिल्ली की त्वचा के लिए बहुत सारे तरीके हैं। हालांकि उत्तर सभी को पहले से ही चुना और चुना गया है। मुझे लगता है कि यह महत्वपूर्ण है कि उचित कोडिंग दिशा-निर्देशों के साथ यह संशोधित हो जाए कि किसी को भी गलत दिशा में जाने से बचने के लिए "बहुमत चयनित सरल उत्तर" के कारण।
तो पहले आइए सरल पोस्ट विलंबित उत्तर पर चर्चा करते हैं जो इस थ्रेड में समग्र रूप से चयनित विजेता है।
कुछ बातों पर विचार करें। पोस्ट देरी के बाद, आप मेमोरी लीक, मृत वस्तुओं, जीवन चक्रों का सामना कर सकते हैं जो चले गए हैं, और बहुत कुछ। इसलिए इसे ठीक से संभालना भी महत्वपूर्ण है। आप इसे कुछ तरीकों से कर सकते हैं।
आधुनिक विकास के लिए, मैं कोटलिन में आपूर्ति करूँगा
यहां कॉलबैक पर UI थ्रेड का उपयोग करने का एक सरल उदाहरण है और पुष्टि करता है कि जब आप अपने कॉलबैक को हिट करते हैं तो आपकी गतिविधि अभी भी जीवित है और अच्छी तरह से है।
Handler(Looper.getMainLooper()).postDelayed({
if(activity != null && activity?.isFinishing == false){
txtNewInfo.visibility = View.GONE
}
}, NEW_INFO_SHOW_TIMEOUT_MS)
हालांकि, यह अभी भी सही नहीं है क्योंकि यदि गतिविधि दूर हो गई है तो आपके कॉलबैक को हिट करने का कोई कारण नहीं है। इसलिए एक बेहतर तरीका यह होगा कि आप इसका संदर्भ रखें और इस तरह से कॉलबैक को हटा दें।
private fun showFacebookStylePlus1NewsFeedOnPushReceived(){
A35Log.v(TAG, "showFacebookStylePlus1NewsFeedOnPushReceived")
if(activity != null && activity?.isFinishing == false){
txtNewInfo.visibility = View.VISIBLE
mHandler.postDelayed({
if(activity != null && activity?.isFinishing == false){
txtNewInfo.visibility = View.GONE
}
}, NEW_INFO_SHOW_TIMEOUT_MS)
}
}
और निश्चित रूप से ऑनपॉज पर सफाई को संभालें ताकि यह कॉलबैक को हिट न करे।
override fun onPause() {
super.onPause()
mHandler.removeCallbacks(null)
}
अब जब हमने स्पष्ट के माध्यम से बात की है, तो आधुनिक दिन कॉरटीन और कोटलिन :) के साथ एक क्लीनर विकल्प के बारे में बात करते हैं। यदि आप अभी तक इन का उपयोग नहीं कर रहे हैं, तो आप वास्तव में गायब हैं।
fun doActionAfterDelay()
launch(UI) {
delay(MS_TO_DELAY)
actionToTake()
}
}
या यदि आप हमेशा उस तरीके से यूआई लॉन्च करना चाहते हैं जो आप कर सकते हैं:
fun doActionAfterDelay() = launch(UI){
delay(MS_TO_DELAY)
actionToTake()
}
बेशक पोस्टडेलैड की तरह आपको यह सुनिश्चित करना है कि आप रद्द करना संभाल लें ताकि आप या तो देरी से कॉल के बाद गतिविधि की जांच कर सकें या आप इसे अन्य रूट की तरह ऑनपॉन्ज में रद्द कर सकें।
var mDelayedJob: Job? = null
fun doActionAfterDelay()
mDelayedJob = launch(UI) {
try {
delay(MS_TO_DELAY)
actionToTake()
}catch(ex: JobCancellationException){
showFancyToast("Delayed Job canceled", true, FancyToast.ERROR, "Delayed Job canceled: ${ex.message}")
}
}
}
}
// संभाल सफाई
override fun onPause() {
super.onPause()
if(mDelayedJob != null && mDelayedJob!!.isActive) {
A35Log.v(mClassTag, "canceling delayed job")
mDelayedJob?.cancel() //this should throw CancelationException in coroutine, you can catch and handle appropriately
}
}
यदि आप लॉन्च (यूआई) को विधि हस्ताक्षर में रखते हैं तो कोड की कॉलिंग लाइन में काम सौंपा जा सकता है।
इसलिए कहानी की नैतिकता आपके विलंबित कार्यों से सुरक्षित है, सुनिश्चित करें कि आप अपने कॉलबैक को हटा दें, या अपनी नौकरियों को रद्द कर दें और निश्चित रूप से पुष्टि करें कि आपके देरी कॉलबैक पूर्ण होने पर वस्तुओं को छूने के लिए आपके पास सही जीवन चक्र है। Coroutines रद्द करने योग्य कार्रवाई भी करता है।
यह भी ध्यान देने योग्य है कि आपको आम तौर पर विभिन्न अपवादों को संभालना चाहिए जो कोरटाइन के साथ आ सकते हैं। उदाहरण के लिए, एक रद्दकरण, एक अपवाद, एक टाइमआउट, जो भी आप उपयोग करने का निर्णय लेते हैं। यदि आप वास्तव में कोरटाइन का उपयोग शुरू करने का निर्णय लेते हैं तो यह एक और अधिक उन्नत उदाहरण है।
mLoadJob = launch(UI){
try {
//Applies timeout
withTimeout(4000) {
//Moves to background thread
withContext(DefaultDispatcher) {
mDeviceModelList.addArrayList(SSDBHelper.getAllDevices())
}
}
//Continues after async with context above
showFancyToast("Loading complete", true, FancyToast.SUCCESS)
}catch(ex: JobCancellationException){
showFancyToast("Save canceled", true, FancyToast.ERROR, "Save canceled: ${ex.message}")
}catch (ex: TimeoutCancellationException) {
showFancyToast("Timed out saving, please try again or press back", true, FancyToast.ERROR, "Timed out saving to database: ${ex.message}")
}catch(ex: Exception){
showFancyToast("Error saving to database, please try again or press back", true, FancyToast.ERROR, "Error saving to database: ${ex.message}")
}
}