2010-12-01 22 views
8

Birkaç web hizmetine erişen ve bilgilerin görüntülendiği birden çok etkinliğe sahip uygulamalar için en iyi genel tasarımın ne olduğunu anlamaya çalışıyorum.Genel uygulama tasarımı (IntentService/ContentProvider/AsyncTask)

En son Android uygulamamı uyguladığım yol aşağıdaki gibidir. Web hizmetlerinden bilgi almak için etkinliklerden gelen istekleri alan bir IntentService var. Benim Service, ResultReceiver aracılığıyla isteğin durumu hakkında bildirir (başlatılmış/hata/bitmiş). Web servisini çağırdıktan sonra (xml/json) sonucu alıp ayrıştırdıktan sonra, bu bilgiyi ContentProvider (sqlite veritabanıyla yedeklenmiş) olarak koydum ve değişikliklerle ilgili herhangi bir aktiviteyi bildirmek için ContentResolver kullanın. Faaliyetler değişikliklerle ilgili olarak bilgilendirilir (bazılarının kullanımı ContentObserver ve diğerleri SimpleCursorAdapter s kullanır ve otomatik olarak bildirilir).

Şimdi benim yaklaşımla sorunlar:

  • Ben bir etkinlik girmek her zaman, yukarıda açıklanan yöntemle web hizmetinden bilgi talep ve ben ile doldurmak, o belirli tablodaki tüm satırları silmek yeni bilgi ve aktiviteyi bildir. Yani, eğer kullanıcı geri basar ve tekrar girerse, tekrar bütün dansı yaparım. Veritabanına, son güncellenen vb. Için bazı alanlar eklemem gerektiğini düşünüyorum ama bununla nasıl devam edeceğimi bilmiyorum. Öneriler? Bir alternatifin alarmları kullanmak ve belirli aralıklarla güncellemeleri tetiklemek olduğunu düşünüyorum. Ama benim durumumda, şartname, aktiviteye her girişimde web servisini kontrol etmeyi ister.
  • Web hizmetini aradığımda, diğer görünümler üzerinde (daha önce getirilen bilgileri içeren ve web hizmet çağrısı bitinceye kadar veritabanında bulunan), etkinlikte belirsiz bir ilerleme çubuğu gösteriyorum ancak kullanıcı etkileşime geçebilir. görünümleri ile ve bu iyi değil (bilgi veritabanından kaybolabilir). Etkileşimi devre dışı bırakmanın herhangi bir yolu var mı? Bir ProgressDialog akla geliyor.
  • Farklı etkinliklerle hızlı bir şekilde hareket edersem, IntentService önceki web servis çağrılarıyla engellenir ve en son web servis çağrısı almak daha uzun sürer. Her web hizmeti için birden fazla IntentService oluşturabilirim ama bunun amacı olduğunu sanmıyorum.

Aldığım yaklaşımın, bu özel uygulama için gerçekten en iyisi olmadığını hissediyorum. Google I/O uygulamasından ilham alan kısmen (güncelleştirilmiş sqlite alanları vb. Gibi her şeyi anlayamadım). Bir alternatif, tüm aktivitelerde AsyncTasks kullanmaktı. Ancak diğer etkinliklerden erişilebilmesi için bilgileri nerede saklayabilirim? Application listelerinde? Ve kimlik yönetimi hakkında ne dersiniz?

Görüşleriniz/fikirleriniz/önerilerinizle gerçekten ilgileniyorum ve sonraki uygulamalarımın daha iyi ve daha verimli çalışmasını nasıl sağlayabilirim.

cevap

2

Bu konuşmayı kontrol ettiniz mi? http://www.youtube.com/watch?v=xHXn3Kg2IQE

İyi bir ilham kaynağı buldum. Temel olarak, bir tekil sınıf olarak bir servis yardımcısı (sizin durumunuzda, niyet hizmetinize servis yardımcısı) oluşturmanızı önerirler. Devam eden istekleri takip edebilirsiniz

Bu şekilde, yürütmekte olduğunuz her türlü devam eden arka plan görevlerini takip edebilir ve aynı türden başka herhangi bir talebi engelleyebilirsiniz. Örneğin, etkinlik a'yı bırakırsanız ve etkinlik b'yi girerseniz ve aynı web hizmeti sorgusunu isterlerse, etkinlik nedeniyle hala devam ettiğini kontrol edebilirsiniz.

iosched uygulamasında gördüklerimden, etkinlik kapatılırsa getirme sonucunun kaybolması sorunu yaşanmaktadır. Sonuç yanı kaybolacak çünkü

Log.w(TAG, "Dropping result on floor for code " + resultCode + ": " + resultData.toString());

Ben de asynctask kullanarak önermiyorum:

diyor net bir günlüğü yok. Bununla birlikte, konuşmaya ve slaytlara bir göz atın.

+0

Peki, sunumu daha önce gördüm ve gelişirken etkilendim. Ama ben hiç gitmedim çünkü kendimi yeterince güvende hissetmedim. Yaklaşımla ilgili daha fazla uygulama detayını görebilseydim yardımcı olurdu. Diğer açık kaynaklı Android uygulamalarını önerebilir misiniz? Teşekkürler. –

+0

Bunu da sıfırdan yeniden düzenlemek zorunda kaldım çünkü açık kaynak örnekleri bulamadım. Oldukça kötü onlar hakkında konuştuklarından örnekler vermezler ... – fedepaol