Android ♥ Kotlin (Sumber istimewa)
Hai wahai para pembaca blog! Hari ini aku kembali menuliskan blog ini untuk kegiatan saya selama liburan semester pendekku. Sebelumnya saat ini saya sedang menempuh semester 5 (pada post ini diterbitkan) yang sayangnya harus menjalankan perkuliahan secara daring dari rumah karena (sudah pasti) pandemi COVID-19.
Sedikit bocoran buat anda yang penasaran & ingin mencerna sebaik mungkin dengan bacaan favorit kalian lainnya di Medium, ayo simak story yang telah saya buat bersamaan pada pertemuan ke-6 BNCC x Go-Academy di sini!
Pada tahun 2020, BNCC kembali mengadakan BNCC Academy Bootcamp bersama Go-Academy dimana pada tahun ini, BNCC Academy mengangkat tema “Android Development with Kotlin” dimana pada pengembangan aplikasi Android pada saat ini mayoritas sudah beralih ke bahasa pemrograman Kotlin. Pada tahun ini, seluruh kegiatannya diadakan secara daring karena adanya pandemi COVID-19 dan PSBB DKI yang tentunya menghambat upaya pembelajaran on-site (di tempat).
Mengenal Kotlin
Kotlin Programming Language
Buat yang belum familiar dengan Kotlin, Kotlin sendiri adalah bahasa pemrograman yang berbasiskan bahasa pemrograman Java & dikembangkan oleh JetBrains dimana dapat dijalankan pada sistem JVM (Java Virtual Machine) dan dapat inter-operable dengan code Java sehingga mudah untuk diaplikasikan meski dengan campur aduk dengan code Java Anda.
Kotlin sendiri juga bisa anda aplikasikan dalam project anda tidak hanya melalui Android Studio, namun juga pada setiap IDE yang berbasiskan IntelliJ IDEA yang support Kotlin dan juga pada IDE kesayangan anda melalui plugin Kotlin sesuai dengan marketplacenya masing-masing.
Apa bedanya dengan Java?
Jawabannya hampir mirip namun ada beberapa hal yang tentunya bisa mempermudah kamu dalam mengembangkan software yaitu:
- Tanpa titik koma (;) pada setiap akhir statement
- Null safety (Safety call [?.], [?] for nullable, dan [!!.] for non-null assertion)
- Penggunaan
var
danval
sebagai variabel bebas (tanpa harus mendefinisikan object class) -
Smart casts (menggunakan
as
sebagai cast) - Static members digantikan dengan companion objects, top-level functions, extension functions
- Extension functions (penerusan function dari class objects)
- Dan lain sebagainya.. (simak di sini)
Contoh Syntax Kotlin paling dasar:
fun hitungDuaAngka(angka1: Int, angka2: Int): Int {
return angka1 + angka2
}
// atau dipersingkat menjadi:
fun hitungDuaAngka(angka1: Int, angka2: Int): Int = angka1 + angka2
Jika anda ingin mencoba bereksperimen dengan code-code Kotlin, bisa kalian akses melalui Kotlin Koans di sini.
Atau jika anda ingin bersenang-senang melakukan coding Kotlin sesuka hati dimana saja melalui Kotlin Playground di sini.
The Activity Lifecycle
Android Activity Lifecycle
Android Activity Lifecycle
Dalam aplikasi Android, terdapat lifecycle yang berperan penting dalam berjalannya sebuah Activity. Activity juga tentunya mempunyai koneksi ke activity lain melalui Intent. Apa bedanya Activity dan Intent?
Activity sendiri merujuk pada laman yang kita rancang & tampilkan pada layar smartphone sedangkan Intent merupakan fasilitas yang diinginkan oleh Activity (baik berpindah laman/Activity maupun menerima panggilan dari aplikasi lain).
Intent berfungsi dalam perpindahan Activity juga untuk menerima panggilan dari aplikasi lain (misalnya share, bayar pakai QR Code, upload file) dan Launcher.
Dalam project yang saya buat, saya sertakan salah satu demo code yang dapat kalian akses melalui repository saya di sini
Intent tentunya bisa bikin aplikasi anda bisa diakses oleh aplikasi lain dan memungkinkan anda untuk mempunyai 2 launcher untuk activity berbeda lho! Caranya? Tentu dengan intent-filter
, anda dapat menerima panggilan intent apapun bahkan termasuk juga dari launcher dan panggilan dari aplikasi lainnya.
Tanpa adanya intent-filter
sama sekali dalam AndroidManifest.xml
, aplikasi tentunya tidak bisa dibuka karena tidak ada intent yang menerima akses tersebut sama sekali.
Untuk mengetahui informasi lebih lanjut mengenai Intent & Intent Filter dapat dilihat di Android UI Guides - Intents & Intent Filters di bawah:
Intents and Intent Filters | Android Developers
A view for your data: RecyclerView
Bagi developer barbar, menampilkan data perlu berulangkali copy-paste layout yang sama untuk menampilkan data yang berbeda-beda. HAH? kalo datanya sampai ribuan apa kagak mampus?
Ada sebuah View yang sangat sakti dalam menampilkan data-data baik data yang kita buat sendiri maupun data yang diambil dari sumber luar, yaitu RecyclerView!
Mengapa RecyclerView? Karena RecyclerView mempadukan satu elemen layout untuk kemudian dipakai berulang-ulang jika ada pemakaian elemen yang berulang-ulang, terutama jika ada perubahan data.
Layers of RecyclerView
Dalam ReyclerView terdapat 2 komponen penting, yaitu RecyclerView.Adapter
dan RecyclerView.ViewHolder
dimana:
- RecyclerView.Adapter berfungsi untuk menampung data-data yang anda inginkan ke dalam layout tersebut (data pools).
- RecyclerView.ViewHolder untuk melakukan bind data-data dalam Adapter ke RecyclerView itu sendiri (binder).
Tentunya View tersebut sangat amat berguna jika anda menginginkan data yang banyak & berseri untuk ditampilkan dalam View tersebut.
Ingin mengetahui lebih lanjut tentang RecyclerView? Simak lebih lanjut melalui Android Developer UI Guides - RecyclerView di bawah:
Create a List with RecyclerView | Android Developers
Hit your data with OkHttp!
Click website vector created by rawpixel.com - www.freepik.com [Source]
Untuk project yang saya buat, saya menggunakan okHttp sebagai library dalam menjalankan hit API untuk mendapatkan data yang saya butuhkan. Ada berbagai pilihan alternatif lain seperti retrofit untuk mendapatkan API dengan bantuan GSON/library JSON lainnya.
Untuk memasukkan library tersebut (baik okHttp
maupun retrofit
), library tersebut wajib dimasukkan ke dalam build.gradle
dan lakukan “sync project” agar library dapat tersinkronisasi dengan project tersebut.
dependencies {
...
// for image insertion, use Picasso library
implementation 'com.squareup.picasso:picasso:2.71828'
// Use okHttp library
implementation "com.squareup.okhttp3:okhttp:4.8.1"
// or if you using retrofit library
implementation 'com.squareup.retrofit2:retrofit:2.8.0'
}
Dalam Hit API menggunakan okHttp, terdapat 2 function penting yaitu fetchData(lookupAdapter: LookupAdapter)
dan getCallback(lookupAdapter: LookupAdapter): Callback
dimana kedua function tersebut tidak ada dalam library & tidak harus didefinisikan, namun masing-masing mempunyai peranan masing-masing.
Function fetchData
akan memanggil request sesuai dengan URL API yang diinginkan oleh pengguna lalu melakukan enqueue
untuk mendapatkan data-data dari API dengan memanggil function getCallback
di dalamnya.
val lookupDataApiURL = "https://api.kawalcorona.com/indonesia/provinsi/"
val request: Request = Request.Builder().url(lookupDataApiURL).build()
okHttpClient.newCall(request) .enqueue(getCallback(lookupAdapter))
Dalam function getCallback
yang terpanggil oleh okHttpClient
, data akan diambil sebagai JSON (JavaScript Object Notation) untuk kemudian diubah sebagai array oleh JSONArray
untuk kemudian kita olah sendiri datanya menjadi data-class object.
Barangkali code seperti ini terlihat cukup panjang bagi sebagian developer sehingga terkadang dalam kasus tertentu, developer merasa perlu ada beberapa bagian code yang harus diubah dengan alasan yang berbeda (why? Jawabannya ada di smell Divergent Change (Martin Fowler)) sehingga perlu diubah dengan menerapkan building block salah satunya adalah MVP (Model-View-Presenter).
Architectural Takeaway: Model-View-Presenter Building Block
“Poorly designed code usually takes more code to do the same things, often because the code quite literally does the same thing in several places.” ― Martin Fowler
Pada bagian code diatas, barangkali cukup memusingkan apalagi disertai dengan alasan efisiensi waktu, code tersebut diselesaikan dengan teknik ‘hajar’ bagian code tanpa peduli building block apa yang mau diterapkan pada data fetching from API tersebut.
Domain conceptual levels at stance [Source]
Dalam Software Engineering, diperkenalkan Design Pattern, Domain Design, dan Building Block dimana ketiga elemen tersebut dapat membantu para developer menciptakan software dengan rapi, jelas, dan mudah dipahami oleh pengguna maupun developer lain.
Pada dasar dalam penerapan Domain Design, Aplikasi terbagikan dalam 6 Level yaitu:
- View
- Controller
- Handler
- Repository
- Factory
- Model
Atau jika dipersingkat dan disederhanakan:
- View (the user interface)
- Controller (connector between View and Model)
- Repository (user-defined data storage)
- Model (the data fetched from database/online sources)
Terdapat beberapa building block untuk mempermudah integrasi aplikasi antara View, Controller, dan Repository yaitu melalui:
- MVC (Model-View-Controller)
- MVP (Model-View-Presenter)
- MVVM (Model-View-ViewModel)
MVC vs MVP, the two of most common building block in Android Architecture
Pada project yang saya kerjakan, saya menerapkan model arsitektur MVP (Model-View-Presenter) yang diajarkan oleh Raditya Gumay dan Egi Adtya dalam kegiatan BNCC Academy hari ke-5.
Untuk menyederhanakan permodelan tersebut, terdapat 4 langkah dalam pemisahan layer dalam sebuah activity, yaitu:
- Buatkan 2 class, representatif untuk pisahin layer View dari business logic & data processing logic (Presenter & Model).
- Definisikan 3 interface representasi MVP building block yaitu, Presenter dengan parameter Model dan View, Model dengan parameter Callback, serta View untuk diimplementasikan pada masing-masing representasi layernya.
- Pisahkan
fetchData
ke Model class (anggap nama barunyagetData
dengan return value berupaCallback
) &getCallback
ke Presenter class. - Pastikan dalam View/Activity telah mengimplementasikan building block View agar mudah dipanggil oleh class lain.
Maka hasilnya akan semakin mempermudah anda dalam memahami isi code tersebut lebih mudah dengan penerapan building block!
Kepanjangan? Terlalu ribet dengan panjangnya code yang aku buat? Atau penasaran ingin mencoba mengaplikasikan building block ke project aplikasi Android-mu dengan inovasi anda masing-masing? Ketiga bagian code tersebut merupakan contoh penerapan MVP dan okHttp
yang diaplikasikan dalam Project Siaga COVID-19 yang dikerjakan secara personal dan perkelompokan selama BNCC x GoAcademy berlangsung.
Sebagai referensi, saya juga menyertakan building block agar teman-teman dapat mengimplementasikan building block ini dengan mudah dan cepat dalam penerapan MPV architecture.
What’s next in Kotlin Development?
Dalam development aplikasi Android berbasis Kotlin, sudah banyak developer yang memanfaatkan Kotlin sebagai preferred programming language-nya salah satunya Gojek, DANA, hingga Google dengan masing-masing inovasi yang super duper inovatif.
Kotlin development in Gojek (visit Gojek blog at https://blog.gojekengineering.com/tagged/kotlin)
Dalam beberapa produk Google, terdapat aplikasi yang memanfaatkan RecyclerView ini dengan tingkat kompleksitas yang cukup tinggi. Bahkan dalam RecyclerView terdapat informasi-informasi yang padat dan beragam mengenai aktivitas yang ingin anda ikuti tentunya.
Google Calendar in Android [Source: Nokia Power User]
Dan buat anda yang ingin belajar lebih lanjut mengenai API dalam pemrograman Android, silahkan disimak pada link di bawah:
- OkHttp: https://square.github.io/okhttp/
- Tutorial OkHttp: https://www.journaldev.com/13629/okhttp-android-example-tutorial
- Retrofit: https://square.github.io/retrofit/
- Tutorial Retrofit: https://www.journaldev.com/13639/retrofit-android-example-tutorial
Satu lagi, saya juga sertakan link repository yang tentunya sangat disayangkan jika anda tidak mencoba Aplikasi hasil eksperimen saya sendiri dengan Project COVID-19 Data selama BNCC x Go-Academy berlangsung di bawah:
akmalrusli363/BNCC-Academy-Kotlin-Demo
Sekian post saya mengenai kegiatan saya di BNCC x Go-Academy, semoga bermanfaat bagi kita semua & sampai ketemu di post selanjutnya