Pada tutorial sebelumnya, kita berbicara tentang pola Model View Presenter, bagaimana penerapannya di Android, dan apa keuntungan terpentingnya. Dalam tutorial ini, kita mengeksplorasi pola Model View Presenter secara lebih rinci dengan menerapkannya di aplikasi Android.
Dalam tutorial ini:
kita membangun aplikasi sederhana dengan menggunakan pola MVP
kita mengeksplorasi bagaimana menerapkan pola MVP di Android
dan kita membahas bagaimana mengatasi beberapa kesulitan yang disebabkan oleh arsitektur Android
1. Model View Presenter
Pola Model View Presenter adalah pola arsitektural yang didasarkan pada pola Model View Controller (MVC) yang meningkatkan pemisahan kekhawatiran dan memfasilitasi pengujian unit. Ini menciptakan tiga lapisan, Model, View, dan Presenter, masing-masing memiliki tanggung jawab yang jelas.
Model memegang logika bisnis aplikasi. Ini mengontrol bagaimana data dibuat, disimpan, dan dimodifikasi. View adalah antarmuka pasif yang menampilkan data dan mengarahkan tindakan pengguna ke Presenter. Presenter bertindak sebagai perantara. Ini mengambil data dari Model dan menampilkannya di View. Ini juga memproses tindakan pengguna yang diteruskan oleh View.
2. Perencanaan Proyek & Penyiapan
Kita akan membuat aplikasi catatan sederhana untuk menggambarkan MVP. Aplikasi ini memungkinkan pengguna mencatat, menyimpannya di database lokal, dan menghapus catatan. Untuk membuatnya sederhana, aplikasi hanya akan memiliki satu Activity.
Layout AplikasiDalam tutorial ini, kita berkonsentrasi terutama pada implementasi pola MVP. Fungsi lainnya, seperti menyiapkan database SQLite, membangun DAO, atau menangani interaksi pengguna, dilewati. Jika Anda memerlukan bantuan untuk topik ini, Envato Tuts+ memiliki beberapa tutorial hebat tentang topik ini.
Diagram Action dan Lapisan MVP
Mari kita mulai dengan membuat catatan baru. Jika kita memecah tindakan ini menjadi operasi-operasi yang lebih kecil, maka inilah yang akan terlihat seperti menggunakan pola arsitektur MVP:
Pengguna mengetik catatan dan mengklik tombol tambah catatan.
Presenter membuat objek Note dengan teks yang dimasukkan oleh pengguna dan meminta Model untuk memasukkannya ke dalam database.
Model memasukkan catatan di database dan menginformasikan kepada Presenter bahwa daftar catatan telah berubah.
Presenter membersihkan field teks dan meminta View untuk menyegarkan daftar untuk menunjukkan catatan yang baru dibuat.
Antarmuka MVP
Sekarang mari kita pertimbangkan operasi yang dibutuhkan untuk mencapai tindakan ini dan memisahkan dengan menggunakan MVP. Untuk menjaga agar berbagai objek digabungkan secara longgar, komunikasi antar lapisan terjadi dengan menggunakan antarmuka. Kita membutuhkan empat antarmuka:
RequiredViewOps: diperlukan operasi View yang tersedia untuk Presenter
ProvidedPresenterOps: operasi ditawarkan ke View untuk berkomunikasi dengan Presenter
RequiredPresenterOps: diperlukan operasi Presenter yang tersedia untuk Model
ProvidedModelOps: operasi ditawarkan ke Model untuk berkomunikasi dengan Presenter
3. Menerapkan MVP di Android
Sekarang kita memiliki gagasan tentang bagaimana berbagai metode harus diatur, kita dapat mulai membuat aplikasi kita. Kita menyederhanakan pelaksanaannya dengan hanya berfokus pada tindakan untuk menambahkan catatan baru. File sumber dari tutorial ini tersedia di GitHub.
Kita hanya menggunakan satu Activity dengan tata letak yang meliputi:
EditText untuk catatan baru
Button untuk menambahkan catatan
RecyclerView untuk mencantumkan semua catatan
dua elemen TextView dan Button di dalam pemegang RecyclerView
Antarmuka
Mari kita mulai dengan membuat antarmukanya. Agar semuanya tetap teratur, kami menempatkan antarmuka di dalam holder. Sekali lagi, dalam contoh ini kita fokus pada tindakan untuk menambahkan catatan baru.
* Operations offered to Model to communicate with Presenter
39
* Handles all data business logic.
40
*/
41
interfaceProvidedModelOps{
42
// Model operations permitted to Presenter
43
intgetNotesCount();
44
NotegetNote(intposition);
45
intinsertNote(Notenote);
46
booleanloadData();
47
}
48
}
Lapisan View
Sekarang saatnya membuat lapisan Model, View, dan Presenter. Karena MainActivity akan bertindak sebagai View, seharusnya mengimplementasikan antarmuka RequiredViewOps.
Presenter adalah perantara dan perlu menerapkan dua antarmuka:
ProvidedPresenterOps untuk mengizinkan panggilan dari View
RequiredPresenterOps untuk menerima hasil dari Model
Beri perhatian khusus pada referensi lapisan View. Kita perlu menggunakan WeakReference<MVP_Main.RequiredViewOps> karena MainActivity dapat dihancurkan kapan saja dan kita ingin menghindari kebocoran memori. Juga, lapisan Model belum disiapkan. Kita melakukannya nanti saat kita menghubungkan lapisan MVP bersama-sama.
getView().showToast(makeToast("Cannot add a blank note!"));
137
}catch(NullPointerExceptione){
138
e.printStackTrace();
139
}
140
}
141
}
142
143
/**
144
* Creates a Note object with given text
145
* @param noteText String with Note text
146
* @return A Note object
147
*/
148
publicNotemakeNote(StringnoteText){
149
Notenote=newNote();
150
note.setText(noteText);
151
note.setDate(getDate());
152
returnnote;
153
154
}
155
}
Lapisan Model
Lapisan Model bertanggung jawab untuk menangani logika bisnis. Ini memegang ArrayList dengan catatan yang ditambahkan ke database, referensi DAO untuk melakukan operasi database, dan referensi ke Presenter.
* Gets a specific note from notes list using its array position
44
* @param position Array position
45
* @return Note from list
46
*/
47
@Override
48
publicNotegetNote(intposition){
49
returnmNotes.get(position);
50
}
51
52
/**
53
* Get ArrayList size
54
* @return ArrayList size
55
*/
56
@Override
57
publicintgetNotesCount(){
58
if(mNotes!=null)
59
returnmNotes.size();
60
return0;
61
}
62
}
4. Mengikat Segalanya Bersama-sama
Dengan lapisan MVP di tempat, kita perlu memberi instantiate dan memasukkan referensi yang diperlukan. Sebelum kita melakukannya, kita perlu membahas beberapa masalah yang terkait langsung dengan Android.
Instansiasi Lapisan-lapisannya
Karena Android tidak mengizinkan instansiasi Activity, lapisan View akan diinstansiasikan untuk kita. Kita bertanggung jawab untuk instansiasi lapisan Presenter dan Model. Sayangnya, instansiasi lapisan di luar Activity bisa menjadi masalah.
Dianjurkan untuk menggunakan bentuk injeksi ketergantungan untuk mencapai hal ini. Karena tujuan kita adalah berkonsentrasi pada implementasi MVP, kita akan mengambil pendekatan yang lebih mudah. Ini bukan pendekatan terbaik yang tersedia, tapi ini yang paling mudah dipahami. Kita akan membahas MVP dan injeksi ketergantungan nanti di serial ini.
instansiasi Presenter dan Model dalam Activity menggunakan variabel lokal
atur RequiredViewOps dan ProvidedModelOps di Presenter
atur RequiredPresenterOps di Model
simpan ProvidedPresenterOps sebagai referensi untuk digunakan di View
1
/**
2
* Setup Model View Presenter pattern
3
*/
4
privatevoidsetupMVP(){
5
// Create the Presenter
6
MainPresenterpresenter=newMainPresenter(this);
7
// Create the Model
8
MainModelmodel=newMainModel(presenter);
9
// Set Presenter model
10
presenter.setModel(model);
11
// Set the Presenter as a interface
12
mPresenter=presenter;
13
}
Menangani Perubahan Konfigurasi
Hal lain yang harus kita pertimbangkan adalah siklus hidup Activity. Activity Android dapat dihancurkan setiap saat dan lapisan Presenter dan Model juga bisa dihancurkan dengannya. Kita perlu memperbaikinya dengan menggunakan beberapa jenis keadaan mesin untuk menyimpan keadaan selama perubahan konfigurasi. Kita juga harus menginformasikan lapisan lain tentang status Activity.
Untuk mencapai hal ini, kita akan menggunakan kelas terpisah, StateMaintainer, yang berisi sebuah Fragment yang mempertahankan kondisinya dan menggunakan fragmen ini untuk menyimpan dan mengambil objek kita. Anda bisa melihat implementasi kelas ini di file sumber tutorial ini.
Kita perlu menambahkan metode onDestroy ke Presenter dan Model untuk memberi tahu mereka tentang status Activity saat ini. Kita juga perlu menambahkan metode setView ke Presenter, yang akan bertanggung jawab untuk menerima referensi View baru dari Activity yang diciptakan kembali.
Pola MVP mampu memecahkan beberapa masalah yang disebabkan oleh arsitektur bawaan Android. Itu membuat kode Anda mudah dipelihara dan diuji. Mengadopsi MVP mungkin terlihat sulit pada awalnya, tapi begitu Anda memahami logika di baliknya, keseluruhan proses itu mudah.
Anda sekarang bisa membuat perpustakaan MVP sendiri atau menggunakan solusi yang sudah tersedia, seperti Mosby atau simple-mvp. Anda sekarang seharusnya lebih memahami apa yang perpustakaan ini lakukan di belakang layar.
Kita hampir di akhir perjalanan MVP kita. Pada bagian ketiga dan terakhir dari seri ini, kami akan menambahkan pengujian unit ke dalam campuran dan menyesuaikan kode kita untuk menggunakan injeksi ketergantungan dengan Dagger. Saya berharap bisa bertemu Anda di sana.
Tin Megali is a curious guy who is always trying to understand the reason of things. He's specialized in Android and Java but he has also coded in many other languages. When he isn't developing, he's probably riding some road with one of his bikes or travelling around to some exotic places.