Lesson 8:
App architecture
(UI layer)
Android Development with Kotlin v1.0 This work is licensed under the Apache 2 license. 1
About this lesson
Lesson 8: App architecture (UI layer)
● Android app architecture
● ViewModel
● Data binding
● LiveData
● Transform LiveData
● Summary
Android Development with Kotlin This work is licensed under the Apache 2 license. 2
Android app architecture
Android Development with Kotlin This work is licensed under the Apache 2 license. 3
Avoid short-term hacks
● External factors, such as tight deadlines, can lead to poor
decisions about app design and structure.
● Decisions have consequences for future work (app can be
harder to maintain long-term).
● Need to balance on-time delivery and future maintenance
burden.
Android Development with Kotlin This work is licensed under the Apache 2 license. 4
Examples of short-term hacks
● Tailoring your app to a specific device
● Blindly copying and pasting code into your files
● Placing all business logic in activity file
● Hardcoding user-facing strings in your code
Android Development with Kotlin This work is licensed under the Apache 2 license. 5
Why you need good app architecture
● Clearly defines where specific business logic belongs
● Makes it easier for developers to collaborate
● Makes your code easier to test
● Lets you benefit from already-solved problems
● Saves time and reduces technical debt as you extend your app
Android Development with Kotlin This work is licensed under the Apache 2 license. 6
Android Jetpack
● Android libraries that incorporate best practices and provide
backward compatibility in your apps
● Jetpack comprises the androidx.* package libraries
Android Development with Kotlin This work is licensed under the Apache 2 license. 7
Separation of concerns
res/layout
UI Controller
(Activity/Fragment) ViewModel
LiveData
Data Layer
Android Development with Kotlin This work is licensed under the Apache 2 license. 8
Architecture components
● Architecture design patterns, like MVVM and MVI, describe a
loose template for what the structure of your app should be.
● Jetpack architecture components help you design robust,
testable, and maintainable apps.
Android Development with Kotlin This work is licensed under the Apache 2 license. 9
ViewModel
Android Development with Kotlin This work is licensed under the Apache 2 license. 10
Gradle: lifecycle extensions
In app/build.gradle file:
Android Development with Kotlin This work is licensed under the Apache 2 license. 11
ViewModel
● Prepares data for the UI
● Must not reference activity, fragment, or views in view hierarchy
● Scoped to a lifecycle (which activity and fragment have)
● Enables data to survive configuration changes
● Survives as long as the scope is alive
Android Development with Kotlin This work is licensed under the Apache 2 license. 12
Lifetime of a ViewModel
Android Development with Kotlin This work is licensed under the Apache 2 license. 13
Kabaddi Kounter
Android Development with Kotlin This work is licensed under the Apache 2 license. 14
ViewModel class
abstract class ViewModel
Android Development with Kotlin This work is licensed under the Apache 2 license. 15
Implement a ViewModel
Android Development with Kotlin This work is licensed under the Apache 2 license. 16
Load and use a ViewModel
Android Development with Kotlin This work is licensed under the Apache 2 license. 17
Using a ViewModel
Within MainActivity onCreate():
Android Development with Kotlin This work is licensed under the Apache 2 license. 18
Data binding
Android Development with Kotlin This work is licensed under the Apache 2 license. 19
ViewModels and data binding
● App architecture without data binding
UI Controller
Views
ViewModel (activity/fragment with
(defined in XML layout)
click listeners)
● ViewModels can work in concert with data binding
Views
ViewModel (defined in XML layout)
Android Development with Kotlin This work is licensed under the Apache 2 license. 20
Data binding in XML revisited
Specify ViewModels in the data tag of a binding.
Android Development with Kotlin This work is licensed under the Apache 2 license. 21
Attaching a ViewModel to a data binding
Android Development with Kotlin This work is licensed under the Apache 2 license. 22
Using a ViewModel from a data binding
In activity_main.xml:
Android Development with Kotlin This work is licensed under the Apache 2 license. 23
ViewModels and data binding
Android Development with Kotlin This work is licensed under the Apache 2 license. 24
LiveData
Android Development with Kotlin This work is licensed under the Apache 2 license. 25
Observer design pattern
● Subject maintains list of observers to notify when state changes.
● Observers receive state changes from subject and execute
appropriate code.
● Observers can be added or removed at any time.
Android Development with Kotlin This work is licensed under the Apache 2 license. 26
Observer design pattern diagram
Observable
notify observe() notify observe()
Observer Observer
Android Development with Kotlin This work is licensed under the Apache 2 license. 27
LiveData
● A lifecycle-aware data holder that can be observed
● Wrapper that can be used with any data including lists
(for example, LiveData<Int> holds an Int)
● Often used by ViewModels to hold individual data fields
● Observers (activity or fragment) can be added or removed
○ observe(owner: LifecycleOwner, observer: Observer)
removeObserver(observer: Observer)
Android Development with Kotlin This work is licensed under the Apache 2 license. 28
LiveData versus MutableLiveData
LiveData<T> MutableLiveData<T>
● getValue() ● getValue()
● postValue(value: T)
● setValue(value: T)
T is the type of data that’s stored in LiveData or MutableLiveData.
Android Development with Kotlin This work is licensed under the Apache 2 license. 29
Use LiveData in ViewModel
Android Development with Kotlin This work is licensed under the Apache 2 license. 30
Add an observer on LiveData
Set up click listener to increment ViewModel score:
Create observer to update team A score on screen:
Add the observer onto scoreA LiveData in ViewModel:
Android Development with Kotlin This work is licensed under the Apache 2 license. 31
Two-way data binding
● We already have two-way binding with ViewModel and
LiveData.
● Binding to LiveData in XML eliminates need for an observer in
code.
Android Development with Kotlin This work is licensed under the Apache 2 license. 32
Example layout XML
Android Development with Kotlin This work is licensed under the Apache 2 license. 33
Example Activity
Android Development with Kotlin This work is licensed under the Apache 2 license. 34
Example ViewModel
Android Development with Kotlin This work is licensed under the Apache 2 license. 35
Transform LiveData
Android Development with Kotlin This work is licensed under the Apache 2 license. 36
Manipulating LiveData with transformations
LiveData can be transformed into a new LiveData object.
● map()
● switchMap()
Android Development with Kotlin This work is licensed under the Apache 2 license. 37
Example LiveData with transformations
Android Development with Kotlin This work is licensed under the Apache 2 license. 38
Summary
Android Development with Kotlin This work is licensed under the Apache 2 license. 39
Summary
In Lesson 8, you learned how to:
● Follow good app architecture design, and the separation-of-concerns
principle to make apps more maintainable and reduce technical debt
● Create a ViewModel to hold data separately from a UI controller
● Use ViewModel with data binding to make a responsive UI with less
code
● Use observers to automatically get updates from LiveData
Android Development with Kotlin This work is licensed under the Apache 2 license. 40
Learn More
● Guide to app architecture
● Android Jetpack
● ViewModel Overview
● Android architecture sample app
● ViewModelProvider
● Lifecycle Aware Data Loading with Architecture Components
● ViewModels and LiveData: Patterns + AntiPatterns
Android Development with Kotlin This work is licensed under the Apache 2 license. 41
Pathway
Practice what you’ve learned by
completing the pathway:
Lesson 8: App architecture (UI layer)
Android Development with Kotlin This work is licensed under the Apache 2 license. 42