2013-04-08 13 views
8

Poszukuję sposobu zawieszenia powiadomień o danym 's Uri. Sprawa użycie jest:Wyłącz powiadomienia na temat identyfikatora UID ContentProvider

  1. Activity jest związany z CursorAdapter przez CursorLoader.
  2. A Service może wykonać wiele aktualizacji wsadowych, jednorzędowych na ContentProvider.
  3. W przypadku każdej aktualizacji wiersza CursorLoader przeładuje swoją zawartość, ponieważ ContentProvider powiadamia detektory o ContentResolver#notifyChange.

Ponieważ nie mogę edytować ContentProvider i mam żadnej kontroli nad wykonywaniem zapytań wsadowych, czy istnieje sposób, aby zawiesić informację na Uri (w wykonującym Service) aż wszystkie ContentProvider -managed zapytań zostały wykonany? Potrzebuję tego, aby uniknąć migotania spowodowanego ciągłym monitowaniem numeru CursorLoader.

+1

Aby dostać tego prawa: ani mieć wpływ na usługi ani CP? Jeśli z drugiej strony usługa jest pod Twoją kontrolą, proszę podać nieco więcej szczegółów na temat tego, jakiego rodzaju aktualizacje CP robisz. –

+0

Wykonuję serię zapytań typu "UPDATE lub INSERT" w prostej pętli 'for'. Używam 'ContentProvider', który powiadamia po każdym' insert' lub 'update', ale w tej konkretnej sytuacji chcę móc zawiesić wszystkie powiadomienia, dopóki nie skończę aktualizować wszystkich encji. – frapontillo

+0

Aby być jeszcze bardziej szczegółowym, generuję 'ContentProvider' przy pomocy generatora Nicolasa Kleina (https: // github.com/foxykeep/ContentProviderCodeGenerator), który pod koniec 'update (Uri uri, wartości ContentValues, Wybór ciągu, String [] selectionArgs) robi proste' getContext(). getContentResolver(). notifyChange (uri, null); '. – frapontillo

Odpowiedz

3

Nie można wyłączyć tego mechanizmu w swojej usłudze. Ale powinieneś spróbować je spakować, używając ContentProviderOperations.

Napisałem introductory post about ContentProviderOperations i dwa dodatkowe posty obejmujące odpowiednio metody withYieldAllowed() i withBackReference().

Szczególnie ten ostatni powinien być interesujący dla tego, co tutaj opisałeś.

Za pomocą ContentProviderOperations można grupować wiele aktualizacji i wstawień. Jeśli następnie wywołasz applyBatch() na obiekcie ContentResolver, ContentProvider wykona je wszystkie naraz.

Teraz nigdy nie używany generator Nicolasa Kleina, ale ponieważ jest on bardzo, bardzo sprawny Android developer i pracuje w Google, założę się, że wygenerowany kod wykorzystuje transakcji i połączeń notifyChange() tylko raz do pełna wsad na końcu.

Dokładnie to, czego potrzebujesz.

+0

Fragment kodu, o którym mówimy, jest [ten] (https://github.com/foxykeep/ContentProviderCodeGenerator/blob/master/generator/res/provider.txt#L184) i myślę, że Nicolas nie umieść tam dowolne powiadomienie, ponieważ nie ma tabeli "Uri" do powiadomienia, ponieważ każda określona operacja może działać na dowolnym 'Uri'. Czy mam rację? – frapontillo

+1

Możesz użyć ogólnego identyfikatora URI. To właśnie robią Kontakty Kontakty i CalendarContract. Powiadomią Cię na końcu pakietu applyBatch za pomocą [CalendarContract.CONTENT_URI] (http://developer.android.com/reference/android/provider/CalendarContract.html#CONTENT_URI) lub [ContactsContract.AUTHORITY_URI] (http: // developer. android.com/reference/android/provider/ContactsContract.html#AUTHORITY_URI) odpowiednio. Proponuję dodać coś takiego do wygenerowanego kodu. –

+0

Mogłabym łatwo powiadamiać o zmianach poza 'ContentProvider', jeśli jestem w stanie zastosować partię operacji, które symulują' INSERT LUB UPDATE '. Czy uważasz, że rozszerzenie 'ContentProviderOperation' i stworzenie niestandardowej operacji' InsertOrUpdate' jest możliwe? To rozwiązałoby to bez zakłócania generowanego kodu. – frapontillo

0

Czy można zastąpić własny ContentResolver?

Możesz spróbować rozszerzyć ContentResolver na swoją własną klasę i możesz zastąpić metodę notifyChange i zrealizować tam swoją logikę.

+0

Chodzi o to, że nie mam informacji o wykonanej operacji w 'notifyChange', ponieważ może to być zwykła, która będzie musiała zostać powiadomiona lub" partia ", która nie będzie. – frapontillo

0

w treści klasy operatora, wewnątrz query() metody przed powrotem kursor, po prostu skomentować kod, który wygląda mniej więcej tak

cursor.setNotificationUri(getContext().getContentResolver(), uri); 
+0

Tak, ale szukam sposobu na uzyskanie tego samego wyniku bez modyfikowania wygenerowanego kodu/generatora. – frapontillo

Powiązane problemy