Reactive Programming pada Android dengan LiveData, Flow, dan RxJava: Kelebihan, Kekurangan, dan Contoh Penggunaan

Arya Rezza
5 min readAug 9, 2023

--

Photo by Gemma Evans on Unsplash

Reactive Programming adalah paradigma pemrograman yang berfokus pada aliran data dan pengubahan statusnya. Di dunia pengembangan Android dengan Kotlin, ada beberapa pilihan untuk menerapkan pendekatan ini, seperti menggunakan LiveData, Flow, dan RxJava. Dalam artikel ini, kami akan membahas kelebihan, kekurangan, dan contoh penggunaan ketiga jenis reactive tersebut.

LiveData

LiveData adalah komponen bawaan Android yang digunakan untuk mengamati perubahan data. LiveData secara otomatis mengikuti siklus hidup komponen Android seperti Activity, Fragment, atau ViewModel, sehingga mencegah memory leak dan memastikan tampilan selalu konsisten dengan data yang ada. Berikut adalah beberapa poin penting tentang LiveData:

Cara Kerja:

LiveData mengizinkan objek pengamat (observer) untuk menerima pemberitahuan ketika data yang diamati mengalami perubahan. LiveData memastikan bahwa observer hanya menerima pembaruan ketika komponen yang diamati dalam keadaan aktif.

Kelebihan:

  • Integrasi Mudah: LiveData terintegrasi dengan baik dengan siklus hidup komponen Android, menghindari masalah memory leak dan crash yang sering terjadi.
  • Penanganan Konfigurasi: LiveData menyimpan data bahkan ketika konfigurasi berubah, seperti rotasi layar.
  • Pembaruan UI Otomatis: LiveData secara otomatis memperbarui UI ketika data yang diamati berubah.

Kekurangan:

  • Terbatas pada Aliran Satu Arah: LiveData dirancang untuk aliran data satu arah (dari ViewModel ke UI), sehingga mungkin kurang fleksibel dalam beberapa skenario.

Contoh Code Pemrograman pada Kotlin:

class LiveDataViewModel : ViewModel() {
private val _data = MutableLiveData<String>()
val data: LiveData<String> = _data

fun fetchData() {
// Simulasi pengambilan data dari jaringan
val newData = "Data from network"
_data.value = newData
}
}

// Di dalam Activity
viewModel.data.observe(this, Observer { newData ->
// Update UI dengan newData
})

viewModel.fetchData()

Contoh Code Lainnya dari LiveData:

Bayangkan Anda memiliki aplikasi cuaca. Anda ingin menampilkan data cuaca saat ini dari API ke UI. LiveData adalah pilihan yang baik karena akan memperbarui UI secara otomatis ketika data berubah, dan menghentikan pembaruan jika UI tidak aktif.

class WeatherViewModel : ViewModel() {
private val _currentWeather = MutableLiveData<String>()
val currentWeather: LiveData<String> = _currentWeather

fun fetchCurrentWeather() {
// Misalkan Anda memanggil API cuaca di sini
val weatherData = "25°C Cerah"
_currentWeather.value = weatherData
}
}

// Di dalam Activity
viewModel.currentWeather.observe(this, Observer { weather ->
// Tampilkan cuaca di UI
})

Flow

Flow adalah bagian dari Kotlin Coroutines yang menyediakan aliran data asinkron berbasis reactive. Flow memungkinkan komposisi, transformasi, dan penggabungan aliran data dengan cara yang serupa dengan RxJava. Berikut adalah beberapa poin penting tentang Flow:

Cara Kerja:

Flow menggunakan konsep aliran data yang dapat diubah dan dikombinasikan dengan operator seperti map, filter, dan merge. Flow juga dapat diubah menjadi tipe data lain seperti LiveData atau StateFlow (aliran data yang memiliki status).

Kelebihan:

  • Fleksibilitas: Flow mendukung aliran data multi-araf dan memiliki operator-operator yang kuat untuk manipulasi data.
  • Kotlin-Centric: Flow merupakan bagian dari Kotlin Coroutines, membuatnya sesuai dengan bahasa Kotlin.

Kekurangan:

  • Tidak Ada Dukungan UI Bawaan: Flow tidak memiliki mekanisme built-in untuk pembaruan UI, seperti yang dimiliki oleh LiveData.

Contoh Code Pemrograman pada Kotlin:

class FlowViewModel : ViewModel() {
private val _data = MutableStateFlow<String>("")
val data: StateFlow<String> = _data

fun fetchData() = viewModelScope.launch {
// Simulasi pengambilan data dari jaringan dengan menggunakan Flow
val newData = "Data from network"
_data.emit(newData)
}
}

// Di dalam Activity
lifecycleScope.launchWhenStarted {
viewModel.data.collect { newData ->
// Update UI dengan newData
}
}

viewModel.fetchData()

Contoh Code Lainnya dari Flow:

Kita ambil contoh aplikasi chat. Anda ingin memperbarui UI setiap kali ada pesan baru. Menggunakan Flow, Anda dapat dengan mudah menangani aliran pesan dan menampilkan pesan-pesan tersebut pada UI.

class ChatViewModel : ViewModel() {
private val _messages = MutableSharedFlow<String>()
val messages: SharedFlow<String> = _messages

fun receiveMessage(message: String) {
viewModelScope.launch {
_messages.emit(message)
}
}
}

// Di dalam Activity
lifecycleScope.launchWhenStarted {
viewModel.messages.collect { message ->
// Tampilkan pesan di UI
}
}

RxJava

RxJava adalah pustaka pihak ketiga yang mengimplementasikan reactive programming dengan aliran data yang kuat. RxJava memiliki banyak operator yang kuat untuk manipulasi aliran data. Berikut adalah beberapa poin penting tentang RxJava:

Cara Kerja:

RxJava mengenalkan konsep Observables dan Observers. Observables menghasilkan aliran data, sedangkan Observers mengamati aliran data dan merespons perubahan.

Kelebihan:

  • Operator yang Kuat: RxJava memiliki banyak operator untuk mengubah, memfilter, dan menggabungkan aliran data.
  • Dukungan Platform: RxJava dapat digunakan di berbagai platform selain Android, seperti Java dan Kotlin di berbagai platform JVM.

Kekurangan:

  • Pembelajaran Lebih Dalam: RxJava memiliki kurva pembelajaran yang lebih tinggi dibandingkan LiveData atau Flow, terutama bagi pengembang yang belum terbiasa dengan reactive programming.
  • Dependensi Eksternal: RxJava memerlukan dependensi eksternal untuk diintegrasikan dalam proyek.

Contoh Code Pemrograman pada Kotlin:

class RxJavaViewModel : ViewModel() {
private val _data = BehaviorSubject.createDefault("")
val data: Observable<String> = _data

fun fetchData() {
// Simulasi pengambilan data dari jaringan dengan RxJava
val newData = "Data from network"
_data.onNext(newData)
}
}

// Di dalam Activity
viewModel.data.subscribe { newData ->
// Update UI dengan newData
}

viewModel.fetchData()

Contoh Studi Kasus Lainnya dari RxJava:

Pertimbangkan aplikasi yang memungkinkan pengguna untuk mencari buku. Setiap kali pengguna mengetikkan kata kunci, aplikasi akan memanggil API untuk mendapatkan hasil. Di sini, RxJava sangat berguna karena Anda bisa melakukan operasi seperti debounce untuk menunda pemanggilan API hingga pengguna selesai mengetik.

class SearchViewModel : ViewModel() {
private val _query = PublishSubject.create<String>()
val searchResults: Observable<List<Book>> = _query
.debounce(300, TimeUnit.MILLISECONDS)
.switchMap { query ->
// Panggil API untuk mencari buku dengan kata kunci
api.searchBooks(query).toObservable()
}

fun onQueryChanged(query: String) {
_query.onNext(query)
}
}

// Di dalam Activity
viewModel.searchResults.subscribe { books ->
// Tampilkan hasil pencarian di UI
}

Perlu diingat bahwa contoh-contoh code pemrograman di atas adalah gambaran umum tentang bagaimana mengimplementasikan reactive programming dalam ViewModel pada Android. Implementasi yang sesungguhnya dapat bervariasi tergantung pada kompleksitas aplikasi dan fitur-fitur yang diperlukan. Pastikan Anda memahami cara kerja masing-masing konsep reactive dan memilih yang paling sesuai untuk kebutuhan proyek Anda.

Epilog

LiveData, Flow, dan RxJava adalah alat yang bermanfaat untuk mengimplementasikan paradigma reactive programming dalam pengembangan aplikasi Android. Pilihan antara ketiganya tergantung pada tingkat kebutuhan dan keahlian Anda dalam penggunaan aliran data asinkron. LiveData cocok untuk proyek sederhana yang memerlukan integrasi siklus hidup komponen. Flow memberikan fleksibilitas dan dukungan multi-araf. RxJava menyediakan operator-operator kuat dan dukungan untuk berbagai platform. Pilih yang paling sesuai dengan proyek dan keahlian Anda.

--

--

Arya Rezza

Android Developer & Content Writer • Banchelor of Computer Science • Reading with Coffee ☕