ดังนั้นมีบางสิ่งที่ควรพิจารณาที่นี่เนื่องจากมีหลายวิธีในการดูแลแมวตัวนี้ แม้ว่าคำตอบจะได้รับการคัดเลือกและเลือกแล้ว ฉันคิดว่ามันเป็นสิ่งสำคัญที่จะได้รับการเยี่ยมชมอีกครั้งพร้อมแนวทางการเข้ารหัสที่เหมาะสมเพื่อหลีกเลี่ยงทุกคนที่ไปในทิศทางที่ผิดเพียงเพราะ "เลือกคำตอบง่ายๆส่วนใหญ่"
ดังนั้นก่อนอื่นเรามาพูดคุยเกี่ยวกับคำตอบแบบโพสต์ล่าช้าแบบง่าย ๆ นั่นคือผู้ชนะที่เลือกคำตอบโดยรวมในหัวข้อนี้
สองสิ่งที่ควรพิจารณา หลังจากการโพสต์ล่าช้าคุณสามารถพบการรั่วไหลของหน่วยความจำวัตถุที่ตายวงจรชีวิตที่หายไปและอื่น ๆ ดังนั้นการจัดการอย่างถูกต้องจึงเป็นสิ่งสำคัญเช่นกัน คุณสามารถทำได้สองวิธี
เพื่อประโยชน์ในการพัฒนาที่ทันสมัยฉันจะจัดหาใน KOTLIN
นี่คือตัวอย่างง่ายๆของการใช้เธรด 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)
}
}
และแน่นอนว่าจัดการกับการล้างข้อมูลบน onPause ดังนั้นมันจึงไม่กระทบการติดต่อกลับ
override fun onPause() {
super.onPause()
mHandler.removeCallbacks(null)
}
ตอนนี้เราได้พูดคุยกันอย่างชัดเจนแล้วมาพูดถึงตัวเลือกที่สะอาดตากับ coroutines และ kotlin ยุคใหม่ :) หากคุณยังไม่ได้ใช้สิ่งเหล่านี้แสดงว่าคุณพลาดไปจริงๆ
fun doActionAfterDelay()
launch(UI) {
delay(MS_TO_DELAY)
actionToTake()
}
}
หรือหากคุณต้องการเปิดตัว UI ในวิธีการนั้นคุณสามารถทำได้โดยง่าย:
fun doActionAfterDelay() = launch(UI){
delay(MS_TO_DELAY)
actionToTake()
}
แน่นอนเช่นเดียวกับ PostDelayed คุณต้องแน่ใจว่าคุณจัดการยกเลิกเพื่อให้คุณสามารถทำการตรวจสอบกิจกรรมหลังจากการโทรล่าช้าหรือคุณสามารถยกเลิกได้ใน onPause เหมือนกับเส้นทางอื่น
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
}
}
หากคุณวางการเปิดตัว (UI) ลงในวิธีการที่เป็นลายเซ็นงานสามารถกำหนดได้ในสายของรหัสโทรศัพท์
ดังนั้นเรื่องราวของศีลธรรมจึงปลอดภัยกับการกระทำที่ล่าช้าของคุณตรวจสอบให้แน่ใจว่าคุณลบการเรียกกลับของคุณหรือยกเลิกงานของคุณและแน่นอนว่าคุณมีวงจรชีวิตที่เหมาะสมในการสัมผัสรายการที่โทรกลับล่าช้าของคุณเสร็จสมบูรณ์ Coroutines ยังมีการกระทำที่ยกเลิกได้
นอกจากนี้ยังควรสังเกตว่าโดยปกติคุณควรจัดการกับข้อยกเว้นต่าง ๆ ที่อาจมาพร้อมกับ coroutines ตัวอย่างเช่นการยกเลิกข้อยกเว้นการหมดเวลาไม่ว่าคุณจะตัดสินใจใช้อะไร นี่คือตัวอย่างขั้นสูงถ้าคุณตัดสินใจที่จะเริ่มใช้ 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}")
}
}