dwarvesf / playbook

Guides for getting things done, programming well, and programming in style.
https://memo.d.foundation
221 stars 47 forks source link

Android KTX is the official Anko #3

Closed thanhnguyenduc157 closed 3 years ago

thanhnguyenduc157 commented 5 years ago

Nếu bạn đã lập trình ứng dụng di động android được một thời gian dài, chắc hẳn đôi khi bạn muốn code của bạn gọn gàng và dễ đọc hơn, lập trình được nhanh và dễ dàng hơn. Sự ra đời của kotlin trong việc phát triển ứng dụng di động android một phần nào đã đáp ứng được điều đó. Một trong số những library đi kèm kotlin là Android ktx và Anko là những library chứa những extension functions chứa những giải pháp cho việc này. Android ktx là cái tên xuất hiện sau, là bản chính thức và nằm trong bộ android jetpack. Sử dụng android ktx là 1 điều rõ ràng, vậy thì những lập trình viên đang xài anko thì sao?

Trước tiên ta xem 1 vd về thấy được lợi ích của việc dùng ktx hoặc anko , bạn có thể xem ví dụ sau đây:

// Kotlin
val bundle = Bundle()
bundle.putLong("id", 1)
bundle.putString("style", "fancy")

// KTX
val bundle = bundleOf("id" to 1, "style" to "fancy)

Rất ngắn gọn và dễ hiểu phải ko nào?

Android Ktx: kể từ khi google support cho kotlin trở thành ngôn ngữ chính thức trong việc lập trình ứng dụng android, ý tưởng sử dụng extension functions được google triển khai 1 cách mạnh mẽ và ngày càng hoàn thiện. Và Android ktx sẽ còn được phát triển nhiều hơn vì nó nằm trong bộ Android Jetpack, điểm cải tiến chính từ Android Pie trở đi.

Anko: là một thư viện Kotlin từ JetBrains. Nó chia sẻ các mục tiêu với Android KTX. Android KTX và Anko tương tự nhau nhưng không hoàn toàn giống nhau .

Sự khác biệt giữa Anko và Android KTX 2 bộ thư viện này có những mục tiêu chung nhưng về định hướng thì KTX không có ý định thêm chức năng mới vào các API Android hiện có.

Anko có phạm vi rộng hơn và điều này cho phép nó linh hoạt để đổi mới và tạo các tính năng mới ( Anko Layouts và Anko Coroutines là ví dụ).

Vậy thì giữa những cái chung và cái riêng của 2 bộ thư viện này có điểm gì đáng để chúng ta cân nhắc . Xin mời các bạn cùng xem qua các tính năng nổi bật rồi chúng ta có thể đưa ra kết luận vậy thì chúng ta sẽ nên dùng cái nào nhé.

Common: là set những library support cho android sdk

Android Ktx:

Anko: sẽ support những mục sau:

Nhìn vào danh sách trên, ta thấy android ktx dĩ nhiên sẽ là lựa chọn trong mục này, để sử dụng cho các nhu cầu liên quan đến những module trên chúng ta nên sử dụng bộ android ktx vì nó mạnh mẽ hơn, đầy đủ hơn.

Sử dụng Android Ktx cho các tính năng liên quan đến Android sdk.

VD:

//kotlin
supportFragmentManager
    .beginTransaction()
    .replace(R.id.my_fragment_container, myFragment, FRAGMENT_TAG)
    .commitAllowingStateLoss()

//ktx
supportFragmentManager.transaction(allowStateLoss = true) {
            replace(R.id.my_fragment_container, myFragment, FRAGMENT_TAG)
        }
// Standard Kotlin way
Snackbar.make(layout, "Go Kotlin!", Snackbar.LENGTH_SHORT)
 .setAction("Undo") {
 // Undo logic
 }
 .show()
// Anko
snackbar(layout, "Go Kotlin!", "Undo") {
 // Undo logic
}

SQLite

Mặc dù android đã có sẵn Room để sử dụng database, nhưng nếu muốn dùng sqlite thuần, vẫn có thể dùng bộ extension function này, Cả 2 bộ thư viện đều support

Sử dụng KTX hoặc Anko đều được.

VD

//kotlin
db.beginTransaction()
try {
    // insert data
    db.setTransactionSuccessful()
} finally {
    db.endTransaction()
}

//ktx
db.transaction {
    // insert data
}
//anko
database.use {
    insert("User", 
        "id" to 42,
        "name" to "John",
        "email" to "user@domain.org"
   )
}

Coroutines

Về Coroutine, đây là điểm mở rộng đầu tiên so với ktx, nhưng có 1 vấn đề là anko cần thời gian để support kotlin coroutines khi Kotlin cho ra version mới, chưa kể đến việc kotlin coroutines vốn sẵn dễ sử dụng. Tuy nhiên không thể phủ nhận sự đơn giản, rõ ràng của Anko Coroutines

Vì chúng ta nên cập nhật liên tục các version mới nhất của các library của android, kotlin nên ta nên dùng kotlin coroutines

VD:

fun getData(): Data { ... }
fun showData(data: Data) { ... }

doAsync(UI) {
    val data: Deferred<Data> = bg {
        // Runs in background
        getData()
    }

    // This code is executed on the UI thread
    showData(data.await())
}

Layouts

Nếu các bạn đã chán với việc tạo layout xml theo kiểu truyền thống thì anko sẽ giúp các bạn vẽ layout trong code được dễ dàng hơn. Đây là điểm mở rộng thứ 2 của Anko so với Ktx. Android ktx không support chuyện này. Về mục này facebook cũng có 1 library support cho việc này nhưng không tốt như anko, chưa kể ta có thể cài thêm plugin để mà xe preview cho anko layout.

Trường hợp cần viết layout trong code sẽ sử dụng Anko

Ví dụ về việc code layout đơn giản

   verticalLayout {
        padding = dip(30)
        editText {
            hint = "Name"
            textSize = 24f
        }
        editText {
            hint = "Password"
            textSize = 24f
        }
        button("Login") {
            textSize = 26f
        }
    }

1 số tính năng thú vị chỉ có riêng ở Android Ktx

Như đã nói ở mục common, Android Ktx support rất nhiều trong bộ androidX, là 1 phần trong bộ AndroidJetpack đó là 1 điều đáng giá để ưu tiên nó vì trong tương lai bất cứ tính năng mới nào, google sẽ cập nhật cho android ktx.

animator.addListener(
        onEnd = {}, 
        onStart = {}, 
        onCancel = {}, 
        onRepeat = {}
)
DayOfWeek.FRIDAY.asInt()
Month.APRIL.asInt()
Year.now().asInt()
val builder = SpannableStringBuilder(urlString)        
    .bold { append("hi there") }
// or even some bold / italic / underlined text if you want!
val builder = SpannableStringBuilder(urlString)        
    .bold { italic { underline { append("hi there") } } }
val adaptiveIcon = bitmap.toAdaptiveIcon()
val drawable = bitmap.toDrawable(resources)
val icon = bitmap.toIcon()
val drawable = someInt.toDrawable()
val icon = someByteArray.toIcon()
val icon = someUri.toIcon()
val colorDrawable = someColor.toDrawable()
val bitmap = drawable.toBitmap(width = someWidth, height = someHeight, config = bitMapConfig)

Đó chỉ là 1 vài ví dụ, bạn có thể tìm hiểu full các function tại đây

Trường hợp cần viết layout trong code sẽ sử dụng Anko

Nói chung, Anko và Android KTX bao gồm các phần khác nhau của API Android và không có lý do gì bạn không thể sử dụng cả hai trong dự án của mình. Như những so sánh trên trong bài viết, tùy theo bạn cần những tính năng nào để sử dụng, bạn sẽ có những lựa chọn của riêng minh. Giữa những điểm chung giữa 2 library chúng ta nên dùng Ktx, còn những cái riêng mà anko có mà project cần sử dụng thì nên sử dụng anko.

Sử dụng Anko khi cần viết layout

Sử dụng KTX cho các tính năng thuộc android sdk

Happy Coding.

Nguồn tài liệu tham khảo:

tieubao commented 5 years ago

👍