หลังจากที่ Kotlin 1.1.0 ปล่อยออกมา
มี feature ที่น่าสนใจมาก ๆ คือ coroutine
โดย coroutine นั้นพัฒนาบน Rx, CompletableFuture, NIO, JavaFX และ Swing
แน่นอนว่าสามารถใช้งานบน Android และ JavaScript ได้
และ coroutine ได้นำแนวคิดมาจากภาษาอื่น ๆ ด้วย เช่น
Generator/yield จากภาษา Python
Channel/select จากภาษา Go
Async/Await จากภาษา C#

ดังนั้นลองนำมาใช้งานกันหน่อย
ซึ่งใช้กับการพัฒนา Android app กันไปเลย

ในการพัฒนา Android app นั้นสิ่งที่ขาดไปไม่ได้เลยก็คือ

การจัดการข้อมูลผ่านระบบ Network
รวมทั้งงานต่าง ๆ ผ่านระบบ I/O
เช่นการดึงข้อมูลจาก REST API
เช่นการดึงรูปภาพมาแสดงผล

ซึ่งสิ่งที่นักพัฒนาทุกคนต้องจัดการให้ได้คือเรื่องของ Thread
การทำงานเหล่านี้ต้องไม่ไปขัดขวางการทำงานของ UI Thread
หรือไป block การทำงานของ UI นั่นเอง
มิเช่นนั้น app จะ crash ได้ ( App XXX หยุดแล้ว )
หรือแม้แต่การทำงานใน Background thread ก็อย่าไปยุ่งกับการทำงานของ UI เช่นกัน
มิเช่นนั้นก็จะมีปัญหาเช่นเดียวกัน

โดยวิธีการจัดการก็มีหลากหลายมาก ๆ
เพื่อทำให้การพัฒนา app ง่ายและสะดวกมากยิ่งขึ้น
ยกตัวอย่างเช่น

  • จัดการ Thread ด้วยตัวเอง มันสนุกมาก ๆ
  • ใช้งาน AsyncTask ของ Android
  • ใช้งานพวก Callback ตัวอย่างเช่นการใช้งาน Retrofit เป็นต้น
  • ใช้งานพวก Rx เช่น AndroidRx เป็นต้น
  • ใช้งาน AsyncAwait

มาดูตัวอย่างการใช้งานนิดหน่อย

1. จัดการด้วย Thread ของ Java

ซึ่งเป็นวิธีการจัดการแบบ manual นั่นเองผ่าน Java Thread นั่นเอง
ทำให้เราสามารถจัดการการทำงานได้ตามที่ต้องการ
แต่ต้องมีความรู้และเข้าใจเรื่อง Threading Model พอสมควร
code ตัวอย่างเป็นดังนี้

ปล. ยังเห็นว่ามีคนใช้งานเยอะอยู่นะ
เพราะว่า บางทีไป copy มาจาก StackOverflow นั่นเอง

2. จัดการด้วย AsyncTask ของ Android

เป็นวิธีการที่ช่วงแรก ๆ นักพัฒนา Android app ต้องใช้งานทุกคน
แต่คำถามคือ
ทำไมมันใช้งานยากจัง ?
จะเขียนเยอะไปไหน ?
ปัจจุบันมีใครบ้างที่ยังใช้อยู่นะ ?

code ตัวอย่างเป็นดังนี้

ส่วนของ Callback และ Rx ไม่ขอพูดถึงนะครับ

เพราะว่ามันง่ายนะ
แต่ก็ต้องแลกมาด้วยความรู้พื้นฐานต่าง ๆ ที่ต้องเข้าใจ
มิเช่นนั้น
ถ้านำไปใช้แบบไม่เข้าใจ
ก็อาจจะเกิด Callback hell หรือ Pyramid of doom ได้
สำหรับการนำวิธีการ Callback ไปใช้งานแบบผิด ๆ
หรือในภาษา Swift ก็เช่น Completion block อาจจะทำให้เกิด Block hell ได้
ส่วนเรื่องของ Rx ผมอธิบายได้ที่ blog เรื่อง Asynchornous สำหรับ Android ไว้แล้ว

มาถึงตัวล่าสุดคือ Async/Await กันบ้าง

ซึ่งมีคนใจดีพัฒนาให้ใช้งานชื่อว่า AsyncAwait
แน่นอนว่าพัฒนาอยู่บน coroutine ของ Kotlin 1.1 นั่นเอง
การใช้งานก็ไม่ยากเท่าไร
เริ่มต้นต้องเขียน code อยู่ใน async block
จากนั้นจึงใช้ await block สำหรับส่วนทำงานอื่น ๆ เช่น long running process
โดยสามารถมี await block ได้มากกว่าหนึ่ง block นะ

code ตัวอย่างเป็นดังนี้

ทำให้ตอนนี้เรามีทางเลือกในการใช้งานมากขึ้นและสะดวกขึ้นนะครับ

Source code ตัวอย่างอยู่ที่ Github::Up1::Kotlin Android AsyncAwait

Reference Websites
https://medium.com/@haarman.niek/async-await-in-android-f0202cf31088#.b95ck5fll