2. Introduction
An application with a solid architecture should be:
•Easy to scale and maintain.
•Each component should be isolated and
decoupled.
•Easy to test
Kotlin and Android Arch Components
4. Components
Create an UI that
automatically
responds to
lifecycle events.
Lifecycle
Kotlin and Android Arch Components
5. Components
Create an UI that
automatically
responds to
lifecycle events.
Lifecycle LiveData
Build data objects
that notify views
when underlying
data changes
Kotlin and Android Arch Components
6. Components
Create an UI that
automatically
responds to
lifecycle events.
Lifecycle LiveData ViewModel
Build data objects
that notify views
when underlying
data changes
Store UI related
data that isn’t
destroyed on app
rotation
Kotlin and Android Arch Components
7. Components
Create an UI that
automatically
responds to
lifecycle events.
Lifecycle LiveData ViewModel Room
Build data objects
that notify views
when underlying
data changes
Store UI related
data that isn’t
destroyed on app
rotation
Access your data
with the power of
SQLite and safety
of in-app objects.
Kotlin and Android Arch Components
12. Kotlin and Android Arch Components
/**
* Displays a message when app comes to foreground and goes to background.
*/
class AppLifecycleObserver @Inject constructor(context: Context) : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onEnterForeground() {
enterForegroundToast.showAfterCanceling(enterBackgroundToast)
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onEnterBackground() {
enterBackgroundToast.showAfterCanceling(enterForegroundToast)
}
}
Lifecycle
13. Kotlin and Android Arch Components
class AppLifecycleObserver @Inject constructor(context: Context) : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onEnterForeground() {
enterForegroundToast.showAfterCanceling(enterBackgroundToast)
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onEnterBackground() {
enterBackgroundToast.showAfterCanceling(enterForegroundToast)
}
}
Lifecycle
ProcessLifecycleOwner.get().lifecycle.addObserver(appLifecycleObserver)
14. Kotlin and Android Arch Components
/**
* Displays a message when app comes to foreground and goes to background.
*/
class AppLifecycleObserver @Inject constructor(context: Context) : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onEnterForeground() {
enterForegroundToast.showAfterCanceling(enterBackgroundToast)
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onEnterBackground() {
enterBackgroundToast.showAfterCanceling(enterForegroundToast)
}
}
Lifecycle
15. Kotlin and Android Arch Components
/**
* Displays a message when app comes to foreground and goes to background.
*/
class AppLifecycleObserver @Inject constructor(context: Context) : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onEnterForeground() {
enterForegroundToast.showAfterCanceling(enterBackgroundToast)
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onEnterBackground() {
enterBackgroundToast.showAfterCanceling(enterForegroundToast)
}
}
Lifecycle
16. LiveData
LiveData is an observable data holder. It lets the
components in your app, usually the UI, observe
data objects for changes.
Kotlin and Android Arch Components
22. LiveData
var userLiveData : MutableLiveData<List<User>> =
MutableLiveData();
userLiveData.value = User(id=1, name="John Doe”)
//Activity or fragment
viewModel.getUsers().observe(
this,
Observer { result ->
run {
//Handle Result
}
})
24. ViewModel
Observes the lifecycle state of the view,
maintaining consistency during configuration
changes and other Android lifecycle events.
The ViewModel class is designed to store and
manage UI-related data so that the data survives
configuration changes such as screen rotations.
Kotlin and Android Arch Components
36. interface BaseDao<T> {
@Insert
fun insert(vararg obj: T)
}
@Dao
abstract class DataDao : BaseDao<Data>() {
@Query("SELECT * FROM Data")
abstract fun getData(): List<Data>
}
Dao
37. @Dao
interface UserDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(user: User)
@Delete
fun delete(user: User)
@Query("SELECT * FROM user_table")
fun getUsers(): List<User>
}
Dao
38. @Dao
interface UserDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(user: User)
@Delete
fun delete(user: User)
@Query("SELECT * FROM user_table")
fun getUsers(): List<User>
}
Dao
39. @Dao
interface UserDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(user: User)
@Delete
fun delete(user: User)
@Query("SELECT * FROM user_table")
fun getUsers(): LiveData<List<User>>
}
Dao
52. Query
@Query("SELECT * FROM users ORDER WHERE age>:age ORDER by
name DESC, id ASC")
abstract fun usersOlderThan(age: Int): LivePagedListProvider<Int, User>
53. ViewModel
class UserViewModel(val db:AppDB) : ViewModel() {
val users: LiveData<PagedList<User>>
fun getUsersOlderThan(age) {
users = db.userDao().usersOlderThan(age)
.create(0, PagedList.Config.Builder()
.setPageSize(20)
.setPrefetchDistance(20)
.setEnablePlaceholders(false)
.build())
}
}