วิธีการหน่วงเวลายอดฮิต บนโค้ด Android

เคยไหมที่ได้รับ requirement ว่า ต้องการให้ view นี้ แสดงหน้านี้ 2 วินาทีแล้วไปหน้าใหม่ หรือแสดง item ห่างกันในเวลาที่เรากำหนด? แล้วทำแบบนี้ได้ยังไง ก็ต้องใช้การหน่วงเวลา หรือ delay ใช่ม้า

แล้วการหน่วงเวลาบน Android มีกี่วิธีกันนะ?

เปรียบเทียบ 3 วิธียอดฮิตแบบเข้าใจง่าย พร้อมตัวอย่างโค้ด

.

1️⃣ Handler.postDelayed

วิธีแรกที่เราใช้กันมาตั้งแต่สมัย Java ล่ะ สุดจะ classic สุด ๆ 😆

Handler เป็น class นึงใน Android เอาไว้ช่วยจัดการในการส่ง และ process Message ตามคิว ไปรันบน Thread ได้ โดยมันจะทำงานร่วมกับ Looper เพื่อรับและจัดการ Message ที่เข้ามาแบบวนลูป

ปกติแล้วเราจะสร้าง Handler ขึ้นมาบน Main Thread ก่อน แล้วใช้ postDelayed() เพื่อให้ทำงานบางอย่างหลังจากผ่านไปช่วงเวลาหนึ่ง ในที่นี้คือให้เรียก doSomething() หลังจากหน่วงเวลา 1000 millisecond หรือ 1 วินาทีนั่นเอง

private val handler = Handler(Looper.getMainLooper())

handler.postDelayed({doSomething()}, 1000L)

ข้อดี คือ ใช้งานง่าย และไม่ต้องใช้ library อื่น ๆ เพิ่มเติม เหมาะกับงานที่ต้องรันบน Main Thread แต่อันนี้ต้องระวังในเรื่อง memory leak เพราะตัว Handler ยังคงอ้างอิงกับ Activity หรือ Fragment ที่เราใช้เรียก Handler ถึงจะปิดไปแล้วก็ตาม

ดังนั้นอย่าลืมเรียก handler.removeCallbacksAndMessages(null) หลังใช้งานนะจ๊ะ เดี๋ยวหาว่าไม่เตือนแล้วแอพค้างไม่รู้ด้วยนะ

.

2️⃣ View.postDelayed

เป็นการหน่วงเวลาโดยใช้ View ที่เราต้องการ เหมาะกับการหน่วงเวลาที่เกี่ยวข้องกับ View นั้น ๆ โดยตรง

หลักการทำงานและหน้าตาคล้าย Handler.postDelayed() แต่เราไม่ต้องสร้าง Handler เอง เพราะ Android จัดการตรงนี้ให้เราแล้ว

เช่น เรามี view อันนึง ชื่อว่า myView แล้วกัน requirement บอกว่าให้เราไม่แสดง view นี้ เมื่อผ่านไป 2 วินาที

myView.postDelayed({

myView.setVisibility(View.GONE)

}, 2000L)

ข้อควรระวัง คือ ถึงแม้จะสะดวก แต่ถ้า View ถูกถอดจากหน้าจอแล้ว โค้ดของเราอาจจะไม่ทำงานได้ ดังนั้นเราจะใช้วิธีนี้ เมื่อมั่นใจว่า View นั้น ๆ จะยังอยู่ก่อนที่การหน่วงเวลาจะสิ้นสุดลง

.

3️⃣ Coroutine และ delay

เราเป็น Kotlin Android Developer กันอยู่แล้วเนอะ 😂

.

ดังนั้นก็ต้องใช้ Coroutine อยู่ล่ะ สามารถใช้ lifecycleScope.launch ร่วมกับ delay() ได้ ซึ่งจะทำให้โค้ดของเราดูเป็นระเบียบและอ่านง่ายสุดๆ

lifecycleScope.launch {

delay(1000L)

doSomething()

}

ข้อดี แน่นอน โค้ดอ่านง่าย ดูเป็นลำดับขั้นตอน ว่ามันต้อง deplay 1 วินาทีก่อน แล้วค่อยทำ doSomething() นะ และพอใช้ lifecycleScope ที่ผูกกับ Lifecycle ของ Activity แล้วเนี่ย มันจะยกเลิกการทำงานเอง เมื่อ Activity ถูกทำลาย แถมไม่ต้องมาสร้าง Handler เองให้ยุ่งยากแล้วมาคอยลบอีก

.

แล้วเพื่อน ๆ ใช้วิธีไหนกันบ้างนะ หรือมีท่าอื่น ก็ comment มาบอกได้เลยน้า

#รวมเรื่องไอที #ไอทีน่ารู้ #programmer #developer #kotlin

2025/8/22 แก้ไขเป็น

... อ่านเพิ่มเติมสำหรับเพื่อนๆ ที่เริ่มเขียนแอป Android การเข้าใจการหน่วงเวลาเป็นเรื่องที่จำเป็นมาก ๆ เพื่อจัดการกับเหตุการณ์ต่าง ๆ เช่น การแสดงข้อมูลช้า ๆ หรือการหน่วงเปลี่ยนหน้าจอ ผมอยากเสริมเกี่ยวกับคำว่า Handler ที่หลายคนสงสัยว่าหมายถึงอะไรใน Android จริง ๆ แล้ว Handler คือคลาสที่ทำหน้าที่ในการส่งและจัดการข้อความหรือคำสั่งต่าง ๆ ให้ไปรันบน Thread ที่ต้องการ เช่น Main Thread หรือ Background Thread นั่นเอง ซึ่งข้อดีของ Handler.postDelayed คือ เหมาะกับการหน่วงเวลาแบบง่าย ๆ และไม่ต้องใช้ Library เพิ่ม นอกจากนี้ควรระวังเรื่อง memory leak เพราะ Handler อาจจะอ้างอิง Activity หรือ Fragment อยู่ ทำให้แอพค้างถ้าไม่ลบคำสั่งใน Handler เมื่อ Activity ถูกทำลาย ด้วยการเรียก handler.removeCallbacksAndMessages(null) หลังใช้งาน สำหรับ View.postDelayed นั้นสะดวกมากถ้าต้องการหน่วงเวลาที่เกี่ยวข้องกับ UI หรือ View โดยตรง เพราะ Android จะจัดการ Handler ให้เราเอง แต่อย่าใช้กับ View ที่อาจจะถูกลบออกจากหน้าจอในระหว่างหน่วงเวลา เพราะโค้ดอาจไม่ถูกเรียกใช้งาน สุดท้ายกับ Coroutine delay ซึ่งถ้าเราเขียน Kotlin อยู่แล้วถือเป็นวิธีที่สะดวกและทันสมัยมาก ๆ โดยใช้ lifecycleScope.launch ร่วมกับ delay() ทำให้โค้ดดูเรียบร้อยและเข้าใจง่าย อีกทั้งยังผูกกับ Lifecycle ของ Activity หรือ Fragment ช่วยลดปัญหาเรื่อง memory leak ได้มาก ภาพจากบทความที่แสดงตัวอย่างโค้ดและข้อควรระวังต่าง ๆ ช่วยให้มองเห็นภาพชัดเจน สำหรับใครที่ยังลังเลว่าจะใช้วิธีไหน แนะนำให้เลือกตามงานและสภาพแวดล้อมที่เหมาะสม เช่น ถ้าเป็น UI หน่วงเวลาง่าย ๆ ใช้ View.postDelayed, ถ้าต้องการความยืดหยุ่นใช้ Handler แต่ถ้าเขียน Kotlin แนะนำ Coroutine จะดีที่สุดครับ หวังว่าข้อมูลนี้จะช่วยให้เพื่อน ๆ สามารถนำไปใช้พัฒนาแอป Android ได้ง่ายขึ้นและปลอดภัยมากขึ้นครับ ถ้ามีเทคนิคอื่น ๆ หรือคำถามเพิ่มเติม ยินดีรับฟังในคอมเมนต์นะครับ!