Handle deprecated code with Kotlin extension
Deprecated Code เป็นเรื่องที่เหล่า Android dev ต้องเจอกันบ่อยๆ แน่ วิธีหลีกเลี่ยงที่ดีที่สุดคือ ไปใช้ Support Library ซะ — แต่ทุกฟังก์ชันไม่ได้มี Support Library วันนี้เลยจะมานำเสนอวิธีแก้เรื่อง Deprecated Code โดยใช้ Kotlin Extension กัน
ถ้าเราเจอ Deprecated Code
ไม่ต้องโวยวาย หรือตกใจไป — ตั้งสติ แล้วเอาเมาส์ไปชี้ จากนั้นตัว Android Studio ที่ชาญฉลาด จะบอกเราเองว่าเกิดอะไรขึ้น
ในตัวอย่างนี้ จะขอยกตัวอย่าง Class Html
แล้วถ้าเรา กดปุ่ม `alt + enter` มันก็จะแนะนำวิธีแก้ให้ แล้วแต่เราจะเลือกเลยว่าจะแก้โดยวิธีไหน
วิธีที่ง่าย และดีที่สุดคือ การเขียนโดยเช็คเงื่อนไขซะ โดยเช็คจาก build version หลังจากนั้นก็แยกการทำงานกัน
val htmlAsSpanned: Spanned = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Html.fromHtml(htmlString, Html.FROM_HTML_MODE_LEGACY)
} else {
@Suppress("DEPRECATION")
Html.fromHtml(htmlString)
}
ข้อสังเกต
ถ้า version ของเครื่อง เป็น N หรือใหม่ว่าโค้ด Html.fromHtml(htmlString, Html.FROM_HTML_MODE_LEGACY) จะทำงาน
แต่ถ้าเป็น version เก่า โค้ดชุดนี้ Html.fromHtml(htmlString) จะทำงานแทน
เห็นมะ ง่ายจะตาย — แต่ ถ้าเรามี logic ในการ covert Html หลายที่หล่ะ มานั้งเขียน if/else เยอะๆ ก็คงไม่ไหว ถ้าเราจะทำ Class Helper ก็ดูเอาท์ไปหน่อยสำหรับ Kotlin ทำไมเราไม่ทำ Extension หล่ะ? — ส่วน Extension คืออะไร นิยามง่ายๆ มันคือส่วนต่อขยายของ class ที่เราสนใจ เพื่อทำงานบางอย่างที่ class เดิมไม่มี function ให้ อ่านเพิ่มเกี่ยวกับ Kotlin Extension
มาเริ่มกันเลย ก่อนอื่นเพิ่ม file ชื่อ StringExtension.kt ในโปรเจคก่อน, เราจะเริ่มทำ Extension สำหรับ String กัน ทำไมถึงเป็น Extension ของ String ไม่เป็นของ Spanned หรือของ Html — เราต้องมามองดูก่อนว่าเราสนใจอะไรในที่นี้ เราต้องการทำ String ให้เป็น Spanned โดย มาจาก Html, มันชัดเจนมาก ว่าเราสนใจ String to Spanned ดังนั้นเราควรเพิ่มความสามารถ toSpanned ตามโค้ดด้านล่าง
fun String.toSpanned() : Spanned {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return Html.fromHtml(this, Html.FROM_HTML_MODE_LEGACY)
} else {
@Suppress("DEPRECATION")
return Html.fromHtml(this)
}
}
Note ถึงแม้ว่าเราจะแก้ปัญหาเรื่อง deprecated โค้ดแล้ว แต่ตัว IDE ยังมองว่า Html.fromHtml() ยัง deprecated อยู่ ดังนั้นเราควรใส่ @Suppress(“DEPRECATION”) เข้าไปด้วย — แต่ห้ามเอาไปโดยไม่เช็ค Version ก่อนหล่ะ ไม่งั้น App ได้บึ้มเป็นโกโก้ครัชแน่
วิธีใช้ ก็ง่ายขึ้นกว่าเดิมอีก ไม่ต้องเรียก Class Html แล้วใส่ Parameter ให้ยุ่งยาก แต่เอา htmlString.toSpanned() ได้เลย
val htmlAsSpanned = htmlString.toSpanned()
สรุป
การเขียน Android เลี่ยงไม่ได้เลย ที่จะต้องเขียนโค้ดให้รองรับหลายเวอร์ชัน วิธีแก้ปัญหาก็มีเยอะแยะ แต่การใช้ความสามารถของ Kotlin น่าจะเป็นหนึ่งในวิธีที่ดีที่สุดในตอนนี้ และตัว Google เองเริ่มปรับ document และ library เป็น Kotlin บ้างแล้ว อนาคตเราคงเห็น Kotlin Extension มาจาก Google เองเลย
แล้วอย่าลืมใช้ Extension กันเยอะๆ นะ มันดี!!!
ขอบคุณที่อ่านจนจบจ้าาา
— จบ —