Force Close dengan MVP Android

Design patern MVP pertama kali saya terapkan saat mengikuti kelas beasiswa dari dicoding, ketika itu saya meniru apa yang diajarkan dan tidak ada yang kurang sama sekali. Walaupun saya tiru 100% contoh coding dari tutorial, ternyata masalah ini masih muncul.

Masalah

Dengan design pattern MVP (Model - View - Presenter) pada android ternyata setiap pergantian activity atau fragment ke activity lain yang dilakukan dengan sangat cepat (kurang dari satu detik) dapat menyebabkan force close karena view yang diminta null. Misalnya dengan klik2 tombol navigasi dengan cepat.

Tentu saja ini bukan masalah pada design patternnya, namun pada cara implementasi yang saya gunakan (dan tutorial tersebut gunakan).

Solusi

View yang null bukanlah view tujuan, namun view activity asal yang masih akan dipanggil oleh presenter ketika programnya masih berjalan. Jadi presenter masih jalan saat aktifitynya sudah berganti namun masih memanggil aktifity lama dalam prosesnya. Terjadilah force close karena dianggap viewnya masih aktifity lama. Solusinya adalah dengan menggunakan null safety pada constructor view di presenter.

Contoh class presenter

class ContohPresenter(
private var view: ContohView?
) {
...
// buat fungsi untuk me-null kan view
// panggil fungsi ini ketika aktifity dalam status onDestroy
fun onDestroy(){
view = null
}
}

Contoh interface View

interface ContohView {
fun showLoading()
fun hideLoading()
}
view raw ContohView.kt hosted with ❤ by GitHub

Contoh fragment yang mengimplementasi ContohView

class ContohFragment : Fragment(), ContohView {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
...
private lateinit var presenter: ContohPresenter
presenter = ContohPresenter(this)
...
}
...
//Pada onDestroy panggil presenter.onDestroy supaya viewnya di set null
override fun onDestroy() {
presenter.onDestroy()
super.onDestroy()
}
}

Dengan menerapkan cara ini, masalah force close pada saat pergantian tampilan yang cepat di aplikasi Android dengan MVP Design Pattern akan teratasi.