2012-04-12 26 views
5

Genel Bakış: OnStart ve async görevlerindeki db bağlantılarının açılması oldukça karmaşık hale gelmiştir. Küresel olarak kullanılabilir db bağlantılarına sahip olmak kötü bir uygulama mıdır? Kötü ise, daha iyi bir yol nedir?Android db bağlantılarını ne zaman açıp kapatmalıyım?

Ayrıntılar: Çeşitli etkinliklerde sqlite3 veritabanına bağlanan bir uygulamam var. İlk başta, veritabanına erişmem gereken birçok yer yoktu, bu yüzden erişime ihtiyaç duyduğum her defasında sadece açılış ve kapanıştaydım. Sonra başka bir Yığın Taşması sorusu üzerinde önerildiği gibi, ona erişmek için gereken daha fazla yer vardı, bir bağlantıya ihtiyaç duyan ve onStop yönteminde kapatacak aktivitenin onStart yönteminde veritabanı bağlantılarını açmaya başladım.

Bu, etkinliği geçersiz kılan bazı eşzamansız görevlerde bağlantılara gerek duymaya başlayana kadar iyi çalıştı. Aktivite için onStop yöntemi çağrıldığından ve bağlantılar kapatıldığından, async görevi veritabanına erişmeye çalıştığı zaman başarısız oldu. Bir çözüm olarak onPreExecute yönteminde açılan ve onPostExecute yönteminde kapatılan her bir eşzamansız görev için ayrı bağlantılar oluşturdum.

Bu, bağlantıların çok fazla açılması ve kapatılmasıyla sonuçlandı ve uygulama bağlamında global olarak kullanılabilir db bağlantıları oluşturmanın iyi bir fikir olup olmadığını merak ediyorum. Kesinlikle bir kod temizlemek ve bir bağlantı kapatmayı unutursam veya uygulama yakın bir güç deneyimliyorsa gerçekleşen kapalı olmayan db istisnalarını temizler. Herhangi biri bunu denedi/bu yaklaşımdaki herhangi bir problemi gördün mü?

+0

Bu iyi bir uygulama, öyle olsun. Kaçınılması gereken temel sorun, yalnızca veritabanı işlemleri için bir sorun olmaması gereken uygulama bağlamını kullanmaktan kaynaklanan bellek sızıntılarıdır. – stealthcopter

cevap

2

Birkaç hafta önce benzer sorunlarla karşılaştım. Bir SQLite db'de kalıcı olan birkaç sınıf kullanıyorum.

Faaliyetleri kalıcılıktan ayırmak istediğim gibi, kalıcı olması gerekenler için statik iç sınıflar (Yöneticiler denir) oluşturdum. Her zaman bir Yönetici oluştururken bir db bağlantısı oluşturuldu ve yöneticiyi kullandıktan sonra açık bir şekilde kapatıyorum. Tablolara erişmek için global yöneticilerim olsaydı, eşzamanlılık nedeniyle senkronize edilmeli ve bu db bağlantılarını ne zaman kapatmam gerektiğini bilmiyorum. Ben de öyle yaptım.

Bu yardımcı olur umarız!

+0

Teşekkürler, eşzamanlılık meselesini düşünmüyordum, aradığım şey buydu. – odiggity

+0

Bir şey değil! Yardım ettiğim için sevindim! :) – Caumons

2

db bağlantılarını açmak ve kapatmak için onPreExecute() ve onPostExecute() adlı bir BaseAsyncTask oluşturabilirsiniz.

AsyncTasks, BaseAsyncTask çağrısı super.onPreExecute() ve super.onPostExecute() öğesini genişletebilir ve doInBackground() yöntemindeki gerçek veri yüklemesini gerçekleştirebilir.

+0

Soruyu daha iyi yanıtladığı için diğer cevabı kabul etmeliydim, ama kesinlikle bunu da yapacağım. Teşekkürler! – odiggity

İlgili konular