พื้นฐาน Android - Thread ในยุคแรกๆบน Android App กับเรื่อง asynchronize ที่มือใหม่ควรรู้

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