Architecture Components: Sử dụng Databinding với LiveData
Như mọi người đã biết, trong version mới của Android Stuido, Google giới thiệu hỗ trợ LiveData với Data Binding . Hôm nay tôi sẽ trình bày ngắn gọn cách sử dụng nó trong project của mình. Ở đây tôi sử dụng version Android Studio 3.1 Canary 9 version. Version này bao gồm thay đổi trong Data ...
Như mọi người đã biết, trong version mới của Android Stuido, Google giới thiệu hỗ trợ LiveData với Data Binding. Hôm nay tôi sẽ trình bày ngắn gọn cách sử dụng nó trong project của mình. Ở đây tôi sử dụng version Android Studio 3.1 Canary 9 version. Version này bao gồm thay đổi trong Data Binding cho phép bạn thay thế ObservableField bằng LiveData trong data binding expressions. Dưới đây là step-by-step làm việc voiws nó. Bạn có thể tải code về để tham khảo.
Setup
Đầu tiên cần upgrade Android Gradle plugin verion:
buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.1.0-alpha09' } }
Nếu bạn sử dụng Kotlin, bạn cũng phải change data binding compiler version:
kapt 'com.android.databinding:compiler:3.1.0-alpha09'
How to use it?
Bạn cần thay thế bất cả ObservableField bằng LiveData trong toàn bộ class. Trước khi thay đổi:
val kittyName = ObservableField<String>() val kittyAge = ObservableInt() init { kittyRepository.receiveNewKitties { kittyName.set(it.name) kittyAge.set(it.age) } }
Sau khi thay đổi:
val kittyName = MutableLiveData<String>() val kittyAge = MutableLiveData<Int>() init { kittyRepository.receiveNewKitties { kittyName.postValue(it.name) kittyAge.postValue(it.age) } }
Để **Data Binding ** làm việc, bạn cần nói cho binding class biết đâu là LifecycleOwner nền bạn cần theo dõi lifecycle property:
val binding: ActivityMainBinding = ... binding.setLifecycleOwner(this)
Ví dụ, chúng ta có thể Log data khi được creating in MainViewModel class
init { kittyRepository.receiveNewKitties { Log.d("MainViewModel", "Generating kitty name: " + it.name) ... } }
Và Log data khi data được upgade trên UI ví dụ sử dụng: TextWatcher trong MainActivity class:
kittyNameText.addAfterTextChangedListener { Log.d("MainActivity", "Showing kitty name: " + it) }
Dưới đây là đoạn Log khi không sử dụng LiveData trong background:
D/MainViewModel: Generating kitty name: TIGER D/MainActivity: Showing kitty name: TIGER D/MainViewModel: Generating kitty name: FLUFFY D/MainActivity: Showing kitty name: FLUFFY
Và khi sử dụng LiveData
D/MainViewModel: Generating kitty name: PUMPKIN D/MainViewModel: Generating kitty name: TIGER
Cảm ơn mọi người đã đọc bài viết này! Bye!!