View Model dan Lifecycle
Pada modul kali ini Anda akan mempelajari tentang ViewModel dan Lifecycle sebagai bagian dari Android Architecture Component.
ViewModel
Di modul pengenalan Android Jetpack, kita sempat membahas sekilas tentang ViewModel. Pada modul ini, Anda akan mempelajari lebih dalam tentang ViewModel hingga cara mengimplementasikan ke dalam proyek Android.
Sebelum masuk ke materi ViewModel, Anda perlu mengetahui bagaimana cara Framework Android mengelola lifecycle dari UI controller seperti Activity atau Fragment. UI controller berfungsi untuk menampilkan data ke UI, memberi aksi terhadap tindakan pengguna atau menangani komunikasi sistem informasi seperti permintaan permission atau perizinan.
Selain itu, UI controller juga memiliki kemampuan untuk mempertahankan data. Seperti di modul sebelumnya, ketika Anda mendapatkan sebuah data dari aksi tertentu seperti data volume, maka untuk mempertahankannya Anda perlu melakukan sesuatu.
Apa itu? Anda perlu menyimpan data tersebut dengan memanggil onSaveInstancestate() dan menampilkan data tersebut di onCreate dengan bantuan Bundle.
Hal di atas bisa dilakukan karena data yang Anda pertahankan berukuran kecil. Namun bagaimana jika data yang Anda jaga berjumlah besar seperti daftar user atau Bitmap? Tentu manajemen UI controller akan bermasalah.
Masalah lain yang terjadi adalah UI controller kerap memanggil secara asynchronous dan membutuhkan waktu tertentu untuk mendapatkan hasil dari proses tersebut.
UI controller perlu mengatur setiap pemanggilan dan memastikan tiada potensi kebocoran memori. Jika beban yang diberikan ke UI controller terlalu berlebihan, tingkat kesulitan dalam melakukan pengujian akan meningkat.
Akan lebih mudah dan lebih efisien jika Anda memisahkan sumber data dengan logika UI controller.
Implementasi ViewModel
Architecture Components menyediakan kelas ViewModel untuk membantu UI controller menyiapkan data yang akan ditampilkan ke UI. Obyek ViewModel akan selalu dipertahankan selama ada configuration changes.
Alhasil, data yang dimilikinya akan segera tersedia untuk Activity atau Fragment selanjutnya. Contohnya jika Anda perlu menampilkan data pengguna di aplikasi Anda, pastikan bahwa Anda sudah menyimpan data pengguna ke kelas ViewModel. Berikut ini adalah contoh ilustrasinya:
Kotlin |
class MyViewModel : ViewModel() { |
Java |
public class MyViewModel extends ViewModel { |
Kemudian Anda dapat mengakses daftar pengguna dari Activity seperti berikut:
Kotlin |
class MyActivity : AppCompatActivity() { |
Java |
public class MyActivity extends AppCompatActivity { |
Catatan: Pada kode di atas, pasti Anda masih belum familiar dengan beberapa komponen seperti LiveData. Untuk materi LiveData kita akan membahasnya di modul 2. Saat ini kita akan fokus dengan penggunaan ViewModel. |
Pada kode di atas ketika Activity dimuat ulang, maka Activity tersebut akan melakukan instance ViewModel yang sama ketika Activity dibentuk pertama kali. Ketika Activity berada dalam proses selesai, maka framework UI akan memanggil metode onCleared di mana obyek ViewModel dapat dibersihkan.
Lifecycle dari ViewModel
Jika digambarkan dengan skema maka akan menjadi seperti ini:
Gambar di atas mengilustrasikan berbagai keadaan lifecycle dari Activity saat ia mengalami rotasi dan kemudian selesai. Gambar di atas juga menunjukkan keterikatan ViewModel terhadap Activity hingga Activity selesai dan dihancurkan.
Perbandingan ViewModel dengan savedInstanceState
Pembeda | ViewModel | savedInstanCestate |
---|---|---|
Lokasi penyimpanan | Di memory | Serialized ke dalam disk |
Mampu bertahan dari configuration change | Ya | Ya |
Bertahan dari proses mematikan app yang dimulai dari sistem | Tidak | Ya |
Bertahan dari kesalahan aktifitas user atau onFinish() | Tidak | Tidak |
Keterbatasan Data | Obyek kompleks akan baik baik saja, namun ruangnya dibatasi oleh memori yang tersedia | Hanya untuk tipe primitif dan obyek kecil dan sederhana seperti String, Integer dll. |
Waktu Read/Write | Cepat (Hanya mengakses memori) | Lambat (Membutuhkan serialisasi / deserialisasi dan akses ke disk) |
Jika dilihat pada tabel di atas, penggunaan ViewModel lebih baik dibanding SaveInstantState, baik waktu baca dan tulisnya maupun dalam obyek yang disimpan. Makin keren kan?
Untuk lebih jelasnya, yuk cek tautan berikut:
Lifecycle
Pada modul sebelumnya, Anda sudah mengetahui apa itu Lifecycle. Jadi seperti apa penggunaan Lifecycle dalam sebuah Activity? Kita ambil contoh dari kasus saat sebuah Activity mengambil lokasi.
Ini adalah kelas MyLocationListener:
Kotlin |
internal class MyLocationListener(context: Context?, callback: Callback?) { |
Java |
class MyLocationListener { |
Dan di bawah ini adalah kelas Activity yang mengmiplementasikan MyLocationListener.
Kotlin |
internal class MyActivity : AppCompatActivity() { |
Java |
class MyActivity extends AppCompatActivity { |
Jika Anda perhatikan kode di atas, normal-normal saja ya kelihatannya? Pun saat dijalankan, tak akan terjadi bug atau masalah di dalamnya. Kelas MyLocationService berfungsi untuk mengelola ketika terkoneksi atau tidak.
Namun, jika diperhatikan sekali lagi, ketika mengimplementasikan kelas MyLocationService, terlalu banyak panggilan yang hanya untuk mengelola UI atau komponen lain sebagai reaksi dari keadaan Lifecycle.
Mengelola banyak komponen di dalam metode Lifecycle seperti onStart() dan onStop(), akan membuat Anda kesulitan saat maintenance. Komponen android.arch.lifecycle menyediakan kelas dan interface yang membantu Anda mengatasi masalah ini dengan cara mudah dan terisolasi.
Seperti yang sudah dipaparkan di atas, Lifecycle memilih fungsi untuk menyimpan informasi mengenai state dari komponen Lifecycle seperti Activity atau Fragment dan memungkinkan sebuah obyek untuk melakukan observasi perubahan keadaan dari sebuah Lifecycle.
Lifecycle mempunyai dua komponen utama untuk melacak perubahan keadaan lifecycle yaitu state dan event.
- Event atau Peristiwa : Peristiwa dari Lifecycle yang dikirimkan dari sebuah Framework dan kelas Lifecycle. Event Lifecycle akan memetakan event callback atau balikan event dalam Activity atau Fragment.
- State atau keadaan : Sebuah keadaan dari komponen yang dilacak dari obyek Lifecycle.
Jika dijabarkan dalam bentuk grafik maka menjadi seperti ini:
Kita asumsikan bahwa sebuah keadaan atau state dari lifecycle adalah simpul dari grafik dan peristiwa atau event adalah tepi antara simpul-simpul tersebut.
Suatu kelas dapat memonitor keadaan sebuah siklus dari komponen Lifecycle dengan menambahkan annotations ke metodenya.
Kemudian Anda bisa menambahkan sebuah observer atau pengamat dengan memanggil metode addObserver() dari kelas Lifecycle dan mengelola hasil dari observer tersebut, seperti yang ditunjukkan dalam contoh berikut:
Kotlin |
class MyObserver : LifecycleObserver { |
Java |
public class MyObserver implements LifecycleObserver { |
Dan cara mengimplementasikan di Activity seperti ini:
Kotlin |
myLifecycleOwner.getLifecycle.addObserver(MyObserver()) |
Java |
myLifecycleOwner.getLifecycle().addObserver(new MyObserver()); |
Pada contoh di atas, objek myLifecycleOwner mengimplementasikan interface LifecycleOwner. MyObserver()-pun dipanggil di kelas utama Anda.
Anda bisa melihat deskripsi lebih lengkapnya di sini:
https://developer.android.com/topic/libraries/architecture/lifecycle