Mengingat posting ini menyebutkan beberapa masalah dalam menggunakan lajang dan setelah melihat beberapa contoh aplikasi Android menggunakan pola lajang, saya bertanya-tanya apakah itu ide yang baik untuk menggunakan Singletons alih-alih satu contoh tunggal dibagi melalui keadaan aplikasi global (subclassing android.os.Application dan mendapatkannya melalui context.getApplication ()).
Apa kelebihan / kekurangan yang dimiliki kedua mekanisme?
Sejujurnya, saya mengharapkan jawaban yang sama dalam posting ini pola Singleton dengan aplikasi Web, Bukan ide yang bagus! tetapi diterapkan pada Android. Apakah saya benar? Apa yang berbeda di DalvikVM?
EDIT: Saya ingin memiliki pendapat tentang beberapa aspek yang terlibat:
- Sinkronisasi
- Dapat digunakan kembali
- Pengujian
sumber
Saya sangat merekomendasikan lajang. Jika Anda memiliki seorang lajang yang membutuhkan konteks, miliki:
Saya lebih suka lajang daripada Aplikasi karena itu membantu menjaga aplikasi lebih terorganisir dan modular - daripada memiliki satu tempat di mana semua keadaan global Anda di seluruh aplikasi perlu dipertahankan, setiap bagian yang terpisah dapat mengurus dirinya sendiri. Juga fakta bahwa lajang malas menginisialisasi (atas permintaan) alih-alih mengarahkan Anda ke jalan melakukan semua inisialisasi di muka di Application.onCreate () baik.
Secara intrinsik tidak ada yang salah dengan menggunakan lajang. Cukup gunakan dengan benar, saat itu masuk akal. Kerangka kerja Android sebenarnya memiliki banyak dari mereka, untuk itu mempertahankan cache per-proses dari sumber daya yang dimuat dan hal-hal lain semacam itu.
Juga untuk aplikasi sederhana multithreading tidak menjadi masalah dengan lajang, karena dengan merancang semua panggilan balik standar ke aplikasi dikirim pada utas utama dari proses sehingga Anda tidak akan memiliki multi-threading terjadi kecuali Anda memperkenalkannya secara eksplisit melalui utas atau secara implisit dengan menerbitkan penyedia konten atau layanan IBinder untuk proses lain.
Hanya berpikir tentang apa yang Anda lakukan. :)
sumber
Dari: Pengembang> referensi - Aplikasi
sumber
Aplikasi tidak sama dengan Singleton. Alasannya adalah:
sumber
Saya memiliki masalah yang sama: Singleton atau membuat aplikasi subclass android.os.Application?
Pertama saya mencoba dengan Singleton tetapi aplikasi saya pada beberapa titik melakukan panggilan ke browser
dan masalahnya adalah, jika handset tidak memiliki cukup memori, sebagian besar kelas Anda (bahkan Singleton) dibersihkan untuk mendapatkan memori sehingga, ketika kembali dari browser ke aplikasi saya, itu macet setiap kali.
Solusi: letakkan data yang diperlukan di dalam subkelas kelas Aplikasi.
sumber
Pertimbangkan keduanya sekaligus:
Selain itu, saya sarankan Anda memperluas Konteks Anda untuk mencakup tidak hanya akses ke objek tunggal tetapi beberapa fungsi yang perlu diakses secara global, seperti misalnya: context.logOffUser (), context.readSavedData (), dll. Mungkin mengubah nama Konteks untuk Fasad akan masuk akal kalau begitu.
sumber
Mereka sebenarnya sama. Ada satu perbedaan yang bisa saya lihat. Dengan kelas Aplikasi Anda dapat menginisialisasi variabel Anda di Application.onCreate () dan menghancurkannya di Application.onTerminate (). Dengan singleton Anda harus mengandalkan VM menginisialisasi dan menghancurkan statika.
sumber
2 sen saya:
Saya memperhatikan bahwa beberapa bidang tunggal / statis diatur ulang ketika aktivitas saya dihancurkan. Saya perhatikan ini pada beberapa perangkat low-end 2.3.
Kasus saya sangat sederhana: Saya hanya meminta private mengajukan "init_done" dan metode statis "init" yang saya panggil dari activity.onCreate (). Saya perhatikan bahwa metode init mengeksekusi kembali dirinya sendiri pada beberapa penciptaan kembali aktivitas.
Meskipun saya tidak dapat membuktikan afirmasi saya, ini mungkin terkait dengan KAPAN singleton / class diciptakan / digunakan terlebih dahulu. Ketika aktivitas hancur / didaur ulang, tampaknya semua kelas yang hanya dirujuk aktivitas ini juga didaur ulang.
Saya memindahkan instance singleton saya ke subkelas Aplikasi. Saya mengaksesnya dari instance aplikasi. dan, sejak itu, tidak melihat masalah lagi.
Saya harap ini bisa membantu seseorang.
sumber
Dari mulut pepatah kuda ...
Saat mengembangkan aplikasi Anda, Anda mungkin perlu berbagi data, konteks, atau layanan secara global di seluruh aplikasi Anda. Misalnya, jika aplikasi Anda memiliki data sesi, seperti pengguna yang saat ini masuk, Anda mungkin ingin mengekspos informasi ini. Di Android, pola untuk menyelesaikan masalah ini adalah membuat instance android.app.Application Anda memiliki semua data global, dan kemudian memperlakukan instance Aplikasi Anda sebagai singleton dengan akses statis ke berbagai data dan layanan.
Saat menulis aplikasi Android, Anda dijamin hanya memiliki satu instance kelas android.app.Application, dan karenanya aman (dan direkomendasikan oleh tim Android Google) untuk memperlakukannya sebagai singleton. Artinya, Anda dapat dengan aman menambahkan metode getInstance () statis ke implementasi Aplikasi Anda. Seperti itu:
sumber
Panggilan aktivitas saya selesai () (yang tidak menyelesaikannya dengan segera, tetapi pada akhirnya akan dilakukan) dan memanggil Google Street Viewer. Ketika saya men-debug-nya di Eclipse, koneksi saya ke aplikasi terputus ketika Street Viewer dipanggil, yang saya pahami ketika aplikasi (keseluruhan) ditutup, yang seharusnya membebaskan memori (karena satu aktivitas yang sedang diselesaikan tidak seharusnya menyebabkan perilaku ini) . Namun demikian, saya dapat menyimpan status dalam sebuah Bundel melalui onSaveInstanceState () dan mengembalikannya dalam metode onCreate () dari aktivitas selanjutnya di stack. Baik dengan menggunakan Aplikasi statis singleton atau subclassing saya menghadapi aplikasi menutup dan kehilangan negara (kecuali saya menyimpannya dalam Bundel). Jadi dari pengalaman saya mereka sama dengan pelestarian negara. Saya perhatikan bahwa koneksi terputus di Android 4.1.2 dan 4.2.2 tetapi tidak pada 4.0.7 atau 3.2.4,
sumber