সুতরাং এই বিড়ালটিকে ত্বকে আটকানোর অনেকগুলি উপায় রয়েছে বলে এখানে কয়েকটি বিষয় বিবেচনা করতে হবে। যদিও উত্তরগুলি ইতিমধ্যে নির্বাচিত এবং নির্বাচিত দেওয়া হয়েছে। আমি মনে করি যে এটি "সংখ্যাগরিষ্ঠ নির্বাচিত সাধারণ উত্তর" এর কারণে যে কেউ ভুল পথে যেতে না পারে তার জন্য যথাযথ কোডিং গাইডলাইনসের সাথে এটি পুনর্বিবেচিত হওয়া গুরুত্বপূর্ণ।
সুতরাং প্রথমে সরল পোস্ট বিলম্বিত উত্তরটি নিয়ে আলোচনা করা যাক এই থ্রেডের সামগ্রিকভাবে বিজয়ী নির্বাচিত উত্তর।
কয়েকটি বিষয় বিবেচনা করতে হবে। পোস্ট বিলম্বের পরে, আপনি মেমরি ফাঁস, মৃত অবজেক্টস, জীবনচক্রগুলি যা চলে গেছে এবং আরও অনেক কিছু মুখোমুখি হতে পারেন। সুতরাং এটি সঠিকভাবে পরিচালনা করাও গুরুত্বপূর্ণ। আপনি এটি বেশ কয়েকটি উপায়ে করতে পারেন।
আধুনিক বিকাশের স্বার্থে, আমি কেটলিনে সরবরাহ করব
কলব্যাকে ইউআই থ্রেড ব্যবহার করার এবং আপনার কলব্যাকটি যখন আঘাত করবেন তখন আপনার কার্যকলাপটি এখনও জীবিত এবং ভাল রয়েছে তা নিশ্চিত করার একটি সাধারণ উদাহরণ এখানে।
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}")
}
}