2010-08-16 14 views

cevap

18

sonra burada ContentProvider diyoruz benim bildiğim kadarıyla göre ne olduğudur bir ContentResolver kullanarak normal kullanım durumunda kastediyorsan:

  1. Ben senin ContentProvider yaşıyor bu örnekte varsayıyorum Bir süreç ve başka bir süreçte faaliyetiniz.

  2. ContentProvider oluşturulmamışsa, onCreate() yöntemi uygulamanın işleminin "ana" dizesini kullanarak çağrılır.

  3. Sorgu()/insert()/update()/delete() yöntemleri, diğer işlemlerden gelen komutları bekleyen her uygulama işleminde bulunan BinderThreads kullanılarak çağrılır. sorgu() /) (insert tetiklenen Aktivite/vs bu yöntem çağrıları birinin ortasında ölürse

ne olur? Kesin bir şey söyleyemem ama ContentProvider'da olup bitenler devam edecek, çünkü ContentProvider işlemi etkilenmeden devam edecek, ancak bu yöntemden sonra ne olacağına kesin olarak emin olamayacağına eminim.

İçerik sağlayıcınız her zamanki sqlite db yerine bir ağ tarafından desteklenmedikçe yavaş bir ağın buna nasıl dahil olacağından emin değilim.

Açıklama:

(/ etc sorgu/ekleme/güncelleme/silme) bir ContentProvider işlevi çağrılırken iki olasılık vardır:

Sizin ContentProvider arayan aynı sürecindedir
  1. . Öyleyse, ContentProvider işlevi, arayanınla aynı iş parçacığına eşzamanlı olarak çalışır.

  2. ContentProvider'ınız arayan kişi olarak farklı bir işlemdir. Öyleyse, ContentProvider işlevi ContentProvider işleminde bir bağlayıcı iş parçacığı üzerinde çalışır.

Her iki durumda da, ContentProvider işlevi döndürene kadar arayan kişi engellenir. Her zaman olduğu gibi, Google ve/veya AOSP kaynak kodunun tüm dokümanlarını okuyun. http://developer.android.com/guide/topics/providers/content-provider-basics.html http://developer.android.com/guide/components/processes-and-threads.html

+0

İçerik Sağlayıcınız aynı süreçte bulunuyorsa ne olur? –

+0

Aslında farklı değil, çağrıyı tetikleyen aynı süreçte, bağlayıcı iplikler üzerinde hala arama/ekleme/güncelleme/silme çağrıları oluyor. Ana iş parçasında oluşmazlar, çünkü bu bir ANR'ye neden olabilir. – satur9nine

+0

Bu nedenle, örneğin bir yayın alıcısının onReceive() yönteminden bir resolver.delete() yönteminin tetiklenmesi ana iş parçacığında doğru olur mu? –

5

http://developer.android.com/reference/android/content/ContentProvider.html

Aynı uygulamada (UI başka) bir uzak işlem sürekli içerik sağlayıcı, bir sorgu ran her zaman yumurtlamaya olmasına neden olan sorun giderme Bu süre tökezledi. Ne yazık ki özel bir şey yazmazsanız, bir işlem yürüttüğü sürece ContentProviders are never destroyed. İçerik sağlayıcısı normalde UI işlem dizisinde (açık olmayan) çalışır, bu nedenle, içerikproviderini sorgulayan uzak bir işlem durumunda, bu ayrı işlem (UI iş parçacığı) olduğu için her bir sorguya yeni bir contentprovider örneği oluşturur. zamanda koşmuyor.

Belki de bunu yapmanın daha iyi bir yolu var, ancak her yaratımda db ve kaynakları kapatmak için rolling my own db or content provider bir çaba harcamak yerine, basit bir çözüm keşfettim.

Bir servisin yaptığı gibi ayrı bir işlemde çalıştırmanın aynı yeteneği vardır. Yani benim örneğimde, içerik sağlayıcısını, uzaktan servisin bulunduğu aynı işleme taşıdım. Sorun çözüldü, artık içerik sağlayıcısı aynı süreçte çalışıyor ve hizmet çalışırken sadece bir kez ortaya çıkıyor. Ayrıca android:multiprocess attribute'a da göz atın.

+2

"ContentProviders asla yok edilmez" - bu belgelerin içinde mi? Değilse, ona güvenmeyin. –

İlgili konular