Dokumen tersebut membahas tentang penggunaan Android Jetpack dan Android Architecture Components untuk membangun aplikasi Android modern yang lebih mudah, lebih cepat dan lebih baik. Android Jetpack merupakan kumpulan perpustakaan yang membantu pengembang mengikuti praktik terbaik, mengurangi kode boilerplate, dan menulis kode yang konsisten di berbagai versi Android."
Dicoding Developer Coaching #32: Android | Reactive Programming dengan RxJava...
Dicoding Developer Coaching #23: Android | Membangun Modern App dengan Jetpack & Android Architecture Component
1. Membangun Modern App dengan
Jetpack & Android Architecture
Component
Ahmad Arif Faizin
Google Associate Android Developer, Curriculum Developer Dicoding
7. Android Jetpack
is a suite of libraries to help developers follow best practices, reduce
boilerplate code, and write code that works consistently across
Android versions and devices so that developers can focus on the
code they care about.
9. "With Android Architecture Components, we're re-architecting our entire
app. It's great to have a Google-endorsed, opinionated, and clean way to
build an Android app that makes it easier to support configuration
changes."
Drew Hannay, Staff Software Engineer, LinkedIn
15. Hindari short-term hack!
● Mendesain aplikasi hanya untuk perangkat tertentu saja
● Copy paste kode ke dalam file Anda secara membabi buta
● Menuliskan secara hardcode untuk string yang tampil
● Menempatkan semua business logic dalam file Activity
16.
17. Why you need good app
architecture?
● Separation of Concern (SoC), memisahkan business logic dan ui logic.
● Memudahkan developer untuk saling berkolaborasi.
● Kode jadi lebih mudah dites.
● Menghemat waktu dan mengurangi technical debt saat project berkembang.
19. Komponen AAC
● ViewModel - Handle data ke UI dan mengatasi configuration change
● LiveData - data holder yang lifecycle-aware dan bisa di-observe secara
real-time untuk mendapatkan data terbaru
● Repository - untuk mengatur beberapa sumber data (network, database,
cache)
● Room - abstraksi di atas SQLite, untuk simpan database dengan lebih simple
dan mudah
20. class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
//initiate TextView
//get data from Webservice (DON’T!)
val response = webservice.getUser(userId)
//show data in TextView
}
}
Sample of Bad Code
21. class UserRepository constructor(
private val webservice: Webservice, //network : retrofit
private val userDao: UserDao //local data : room
) {
suspend fun getUser(userId: String): User {
val userExists = userDao.hasUser()
//jika data local kosong, request network dan masukkan ke local
if (!userExists) {
val response = webservice.getUser(userId)
userDao.save(response.body())
}
return userDao.getUser(userId)
}
}
Sample of Repository
22. class UserProfileViewModel(
userRepository: UserRepository
) : ViewModel() {
private val _userId = MutableLiveData<String>()
val userId: LiveData<String> = _userId
fun setUserId(userId: String) {
_userId.value = userId
}
val user = Transformations.switchMap(_userId) { id ->
userRepository.getUser(id)
}
}
Sample of ViewModel + LiveData
23. class MainActivity : AppCompatActivity() {
val viewModel: UserProfileViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
//initiate TextView
viewModel.setUserId(userId)
viewModel.user.observe(this, Observer<User> {
//show data in TextView
})
}
}
Sample of Good Code
24. Best Practice
● Jangan jadikan activity, services, & broadcast sebagai sumber data.
● Buat batasan yang jelas antar modul.
● Expose sedikit mungkin data pada setiap modul.
● Pertimbangkan cara membuat setiap modul dapat diuji secara terpisah.
● Fokuslah pada inti aplikasi Anda supaya lebih bagus dari aplikasi lainnya.
● Sebisa mungkin simpan data yang relevan dan terbaru.
● Tetapkan satu sumber data sebagai single source of truth.