Android MVP : Membangun Aplikasi Android dengan Arsitektur MVP | Repository Pattern

Rivaldy
5 min readOct 31, 2020

--

#TodayILearned : I got inspired to write from Eminarti Sianturi, thank you 😊

Haloo.., pada tulisan kali ini, saya akan menuliskan tentang bagaimana membangun sebuah aplikasi android dengan menggunakan Arsitektur MVP. sebenarnya tulisan tentang bagaimana membangun aplikasi android dengan Arsitektur MVP sudah ada pada tulisan mba Eminarti Sianturi dan saya pun juga belajar dari tulisan mba emi (eh paggil mba emi saja boleh kan ? ahaha sok akrab saya) 😅.

Adapun perbedaan dari tulisan saya dengan mba emi yang jelas tulisan mba pasti lebih berisi dari saya, karena saya mengambil referensi dari sana juga 😅

Disini saya menggunakan Kotlin, resource API yang saya gunakan The Movie DB dan pada tulisan kali ini saya belum menerapkan Dependency Injection (DI) (Pembahasah DI akan saya bahas pada tulisan saya selanjutnya dan tentunya dengan menggunakan aplikasi sekarang ini. Tujuannya agar dapat dengan mudah dipahami ataupun dapat membedakan kenapa harus memakai DI sih ? Dan juga kita nantinya akan menggunakan ViewBinding agar kodingan kita lebih bersih lagi). Adapun jika ada kesalahan kosakata ataupun penjelasan kurang jelas dari saya mohon dimaklumi yah.

Apa itu Arsitektur MVP ?

MPV / Model-View-Presenter merupakan sebuah konsep ataupun struktur code dalam pengembangan sebuah aplikasi, yang mana tujuannya adalah untuk memisahkan proses bisnis (logic business) yang bekerja pada aplikasi dengan tampilan aplikasi (user interface) .

Berikut penjelasan detail dari Arsitektur MVP :

  • Model : merupakan layer yang menunjuk kepada object dan data yang ada pada aplikasi (data object, data class, entity)
  • View : merupakan layer untuk menampilkan data ke pengguna aplikasi, dapat berupa, Activity, Fragment ataupun Dialog (yang pengguna lihat pada aplikasi).
  • Presenter : merupakan layer yang merupakan penghubung komunikasi antara Model dan View pada aplikasi, dimana pada setiap interaksi yang dilakukan oleh user dari View akan memanggil Presenter untuk memrosesnya dan mengakses Model lalu mengembalikan response dan dikembalikan lagi ke View.

Selain arsitektur MVP, aplikasi yang saya buat ini juga nantinya mengguna Repository Pattern. Repository disini merupkan abstraksi dari data layer yang berfungsi sebagai aliran data, dimana isi dari class abstract tersebut biasanya berupa interface yang memiliki beberapa function/method di dalamnya. untuk gambarannya seperti gambar berikut:

Source from androidhiro.com

Contract Class
Contract Class merupakan sebuah interface, yang dimana class ini akan berisi interface Presenter dan View besersta function/method yang nantinya akan dipakai oleh View.

Struktur Folder
Struktur Folder

Adapun alur implementasi Arsitektur MVP pada aplikasi yang akan kita buat adalah seperti berikut:

1. Adding Dependencies
2. Create Model (Data Class)
3. Create API config (Setup Retrofit)
4. Create Base Class & Contract Class
5. Create Repository
6. Create Presenter
7. Implementation Presenter to View (activity, fragment or dialog)

Baiklah ayo kita mulai…

1. Adding dependencies

berikut beberapa dependency yang kita butuhkan untuk menerapkan arsitektur MPV.

2. Add Model (Data Class)

Ow iya sample endpoint dari API The MovieDb yang akan digunakan adalah, list Movies dari endpoint https://api.themoviedb.org/3/discover/movie?api_key={api-key-themoviedb}&language=en-US .

Untuk api-key-themoviedb didapatkan dari akun The MovieDB anda, silahkan mendaftar jika kalian belum mempunyai akun The MovieDB dan pergi ke pengaturan -> api, yang digunakan adalah API Key (v3 auth).

Berikut data class dari response endpoint API di atas, Movie.kt dan MovieResponse.kt :

API Response

3. Create API config (Setup Retrofit)

Disini saya menggunakan libarary Retrofit sebagai rest client untuk meng-handle semua hal yang berkaitan dengan koneksi seperti fetching data api dari android ke server.

ApiConfig.kt

Setelah setup API dengan retrofit diatas, langkah selanjutnya adalah membuat interface. Yang mana interface ini nantinya akan berisi banyak function dari endpoint The MovieDB API. Ow iya disini saya menggunakan suspend function karena kita akan menggunakan Coroutines untuk request API secara Asynchronous.

ApiTheMovieDb.kt

4. Create Base Class & Contract Class

Pada tahap ini, kita akan membuat Base Class untuk View dan Presenter yang nantinya akan diimplementasikan pada Contract Class pada interface Presenter dan View.

  • Base Class
Base.kt
  • Contract Class (MovieContract.kt)
MovieContract.kt

Ow iya, pada Base Class kamu boleh menambahkan interface ataupun function lain sesuai kebutuhan, begitupun dengan Contract Class. Pada Contract Class yakni class MovieContract, interface View akan di impelematasikan ke View (activity, fragment ataupun dialog) dan interface Presenter akan di impelementasikan ke Presenter (MoviePresenter).

5. Create Repository

Sebelumnya saya sudah menjelaskan bahwa kita juga akan menerapkan Repository Pattern pada aplikasi. Terdapat 3 class yang akan kita buat yaitu : MovieRepository, MovieDataSource dan MovieRemoteDataSource.

  • MovieRepository : merupakan class yang nantinya mempunyai sekumpulan function dari implementasi interface MovieDataSource yang akan digunakan oleh MoviePresenter
  • MovieDataSource : sekumpulan function dan interface untuk callback dari function itu sendiri yang nantinya akan diimplementasikan oleh MovieRepository dan MovieRemoteDataSource
  • MovieRemoteDataSource : merupakan class yang nantinya mempunyai sekumpulan function dari implementasi interface MovieDataSource yang akan digunakan oleh MovieRepository. Nah pada class ini, disinilah proses handle/request API yang memanggil function yang ada pada interface ApiTheMovieDb (remote atau yang berhubungan dengan internet), dimana hasil dari request tersebut akan diteruskan/pass ke MovieRepository.

Sebenarnya kita dapat membuat 1 file saja, semua interface ataupun function berada pada class MovieRepository, tetapi misal pada aplikasi kita nantinya ingin menggunakan local data storage seperti SQLite dsb, dan tujuannya juga tentunya agar kodingan kita lebih mudah proses maintenance kedepannya, jadi sebaiknya kita pisahkan menjadi beberapa bagian. Ow iya misal kita nantinya ingin menggunakan local storage buat Class lagi misal MovieLocaleDataSource (pada class ini, nantinya semua function yang berhubungan dengan set/get data dari local storage diletakkan pada class ini)

6. Create Presenter

Seperti yang dijelaskan sebelumnnya, Presenter merupakan layer yang merupakan penghubung komunikasi antara Model dan View pada aplikasi.

Berikut class MoviePresenter:

MoviePresenter.kt

Class MoviePresenter merupakan implementasi dari MovieContract.Presenter. Pada class ini, kita akan akan memanggil function yang dibutuhkan dari class MovieRepository dan hasil pengolahana data dari MovieRepository akan diteruskan/pass ke View (disini saya akan menggunakan MainActivity sebagai UI).

7. Implementation Presenter to View (activity, fragment or dialog)

Yeay.. 🎉

Sekarang kita sudah masuk pada tahap akhir, yaitu menampilkan data ke View. View yang akan saya gunakan disini adalah MainActivity, yang nantinya akan menampilkan list movie, dan tentunya kita membutuhkan komponen RecyclerView untuk menampilkan data pada activity.

Ow iya, disini saya tidak akan menjelaskan bagaimana pembuatan layout xml untuk UI nya, begitupun dengan Adapter yang dibutuhkan oleh RecyclerView. Kunjungi repository github saya, untuk melihat XML dan Adapternya.

berikut implementasi Presenter dari Contract Class ke MainActivity

MainActivity.kt

Tadaaaa selesai … 🎉👏

Untuk source code lengkapnya, kunjungi repository saya MVP with Repository Pattern. Setelah ini, saya akan menulisakan juga, bagaimana sih implementasi Dependency Injection (biasa disingkat DI) pada aplikasi sekarang ini.

Semoga tulisan saya dapat membantu anda dalam memahami penerapan Arsitekture MVP dengan Repository Pattern. Ow iya jangan lupa tekan 👏 Clapp yah biar saya tahu ada yang terbantu dan ada juga yang membacanya ternyata, ahaha.. 😅 Thank you.

--

--

Rivaldy

Make it fun | Find me on my GitHub page at https://github.com/im-o. And let's connect over coffee! ☕ You can reach me on any social media at @rivaldy_o."