Thread คือการทำงานใน background process
สำหรับงานที่มีเวลามาเป็นส่วนประกอบเช่นการรอการตอบกลับของฝั่ง Web server
ถ้าไม่ได้ทำใน background process แอพก็จะเด้ง
หรืออาจจะทำงานผิดพลาดได้ครับ
เริ่มต้นจาก Basic
Thread(Runnable {
// ตรงนี้อาจจะคิดว่าเป็นฟังก์ชั่นสำหรับส่ง user password ไป login กับฝั่ง WebServer ก็ได้นะครับ
..
..
Log.e(TAG, "Run background procress")
}).start()
Log.e(TAG, "Thread Finish")
จากโค้ดด้านบนจะได้ output เป็น
Thread Finish
Run in background procress
ที่เป็นแบบนี้เพราะตัว Thread นี้ทำงานแบบ asynchronize
สรุปให้เข้าใจง่ายๆก็คือ มันกระโดดไปทำงานโค้ดบรรทัดถัดไปเลย
โดยไม่รอให้ background procress ทำงานเสร็จก่อน
ผมเคย...ใช้วิธีหยุดรอซักพักให้ Thread ทำงานจบก่อน
เพราะมันง่ายคือแค่นำ Thread.sleep(1000) เข้ามาคั่นไว้
Thread(Runnable {
Log.e(TAG, "Run in background procress")
}).start()
Thread.sleep(1000)
Log.e(TAG, "Thread Finish")
แต่วิธีนี้มีปัญหาคือ : ถ้า process นั้นทำงานนานกว่าเวลาที่เรา sleep ไว้... จบเลยครับ จากการ Research ง่ายสุดคือใช้ Handler เข้ามาช่วยในการ Update UI เมื่อ Thread ทำงานเสร็จ ได้ครับ
val handler = Handler()
Thread(Runnable {
Log.e(TAG, "Run background procress")
handler.post {
imageView.setImageResource(R.mipmap.ic_launcher)
}
}).start()
*ปัจจุบันก็ยังทำได้อยู่ครับ
แต่มีอีกหลายๆตัวให้เพื่อนๆ ได้ศึกษาต่อ เช่น :
- ฟังก์ชั่น Download ไฟล์ .mp3 จากอินเตอร์เน็ตควรใช้ Download Manager
- อยากให้ทำงานแบบปิดแอพ แต่ Thread ยังทำงานอยู่ก็ใช้ Foreground Service
- ถ้าต้องการให้ Thread ทำงานเองตามสถานะการณ์นั้นๆ
(Trigger by system condittions) ใช้ WorkManager
- ถ้าต้องการความแม่นยำเรื่องเวลาใช้ AlarmManager
___________________________________________________
ข้อมูลเพิ่มเติม https://developer.android.com/guide/background