Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

[Kotlin] มาใช้งาน AsyncAwait สำหรับ Android app กัน

$
0
0

หลังจากที่ 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 ตัวอย่างเป็นดังนี้ [gist id="9fcfb977b10c9935647e297e49b9d291" file="solution1.kt"] ปล. ยังเห็นว่ามีคนใช้งานเยอะอยู่นะ เพราะว่า บางทีไป copy มาจาก StackOverflow นั่นเอง

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

เป็นวิธีการที่ช่วงแรก ๆ นักพัฒนา Android app ต้องใช้งานทุกคน แต่คำถามคือ ทำไมมันใช้งานยากจัง ? จะเขียนเยอะไปไหน ? ปัจจุบันมีใครบ้างที่ยังใช้อยู่นะ ? code ตัวอย่างเป็นดังนี้ [gist id="9fcfb977b10c9935647e297e49b9d291" file="solution2.kt"]

ส่วนของ 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 ตัวอย่างเป็นดังนี้ [gist id="9fcfb977b10c9935647e297e49b9d291" file="solution3.kt"] ทำให้ตอนนี้เรามีทางเลือกในการใช้งานมากขึ้นและสะดวกขึ้นนะครับ Source code ตัวอย่างอยู่ที่ Github::Up1::Kotlin Android AsyncAwait Reference Websites https://medium.com/@haarman.niek/async-await-in-android-f0202cf31088#.b95ck5fll

Viewing all articles
Browse latest Browse all 1997

Trending Articles