2013-04-08 16 views
8

Sto cercando un modo per sospendere le notifiche su un dato ContentProvider di Uri. Il caso d'uso è:Disabilitare le notifiche su un URI ContentProvider

  1. Un Activity è associato a un CursorAdapter attraverso un CursorLoader.
  2. A Service È possibile eseguire molti aggiornamenti batch, riga singola su un ContentProvider.
  3. Il CursorLoader ricaricherà il contenuto su ogni aggiornamento di riga, poiché lo ContentProvider notifica i listener ContentResolver#notifyChange.

Poiché non posso modificare il ContentProvider, e non ho alcun controllo sull'esecuzione di query in batch, c'è un modo per sospendere le notifiche su un Uri (in esecuzione Service) fino a quando tutti i ContentProvider query -computer sono stati eseguito? Ne ho bisogno per evitare lo sfarfallio causato dalla continua richiesta del CursorLoader.

+1

Per ottenere questo diritto: non avete né influenza sul servizio, né il CP? Se, d'altro canto, il Servizio è sotto il tuo controllo, ti preghiamo di fornire maggiori dettagli su quale tipo di aggiornamenti CP stai facendo. –

+0

Sto eseguendo una serie di query "UPDATE o INSERT" all'interno di un semplice ciclo 'for'. Sto usando un 'ContentProvider' che notifica dopo ogni' insert' o 'update' ma, in questa particolare situazione, voglio essere in grado di sospendere tutte le notifiche fino a quando non ho finito di aggiornare tutte le entità. – frapontillo

+0

Per essere ancora più dettagliato, sto generando il mio ContentProvider con un generatore di Nicolas Klein (https: // github.com/foxykeep/ContentProviderCodeGenerator) che, alla fine di un aggiornamento (valori Uri uri, valori ContentValues, selezione String, String [] selectionArgs) 'fa un semplice' getContext(). getContentResolver(). notifyChange (uri, null); '. – frapontillo

risposta

3

Non è possibile disattivare questo meccanismo nel servizio. Ma dovresti provare a raggrupparli usando ContentProviderOperations.

Ho scritto un introductory post about ContentProviderOperations e due post aggiuntivi che riguardano rispettivamente i metodi withYieldAllowed() e withBackReference().

Soprattutto quest'ultimo dovrebbe essere di interesse per quello che hai descritto qui.

Con ContentProviderOperations è possibile eseguire il batch di più aggiornamenti e inserimenti. Se quindi si chiama applyBatch() sull'oggetto ContentResolver, ContentProvider li esegue tutti in una volta.

Ora non ho mai usato generatore di Nicolas Klein, ma dal momento che è uno sviluppatore Android molto, molto abile e lavora a Google, scommetto che il codice generato si avvale di transazioni e chiamate notifyChange() solo una volta per la completa lotto alla fine.

Esattamente quello che ti serve.

+0

Il pezzo di codice di cui stiamo parlando è [questo] (https://github.com/foxykeep/ContentProviderCodeGenerator/blob/master/generator/res/provider.txt#L184), e penso che Nicolas non abbia metti tutte le notifiche là dentro perché non ci sarà alcun Uri' a livello di tabella da notificare, dato che qualsiasi 'Operazione' può funzionare su qualsiasi 'Uri'. Sono corretto? – frapontillo

+1

È possibile utilizzare un URI generico. Questo è ciò che ContactsContract e CalendarContract stanno facendo. Ti avvisano alla fine di applyBatch utilizzando [CalendarContract.CONTENT_URI] (http://developer.android.com/reference/android/provider/CalendarContract.html#CONTENT_URI) o [ContactsContract.AUTHORITY_URI] (http: // developer. android.com/reference/android/provider/ContactsContract.html#AUTHORITY_URI) rispettivamente. Suggerisco di aggiungere qualcosa come questo al codice generato. –

+0

Potrei facilmente notificare le modifiche al di fuori di 'ContentProvider' se sono in grado di applicare un batch di operazioni che simulano un' INSERT O UPDATE'. Pensi che estendere 'ContentProviderOperation' e creare un'operazione personalizzata di 'InsertOrUpdate' sia fattibile? Ciò risolverebbe senza incasinare il codice generato. – frapontillo

0

È possibile sostituire il proprio ContentResolver?

Si può provare a estendere ContentResolver con la propria classe, quindi è possibile sovrascrivere il metodo notifyChange e realizzare la propria logica.

+0

Il problema è che non ho informazioni sull'operazione eseguita in 'notifyChange', poiché potrebbe essere una normale che dovrà essere notificata o una" batch "che non lo sarà. – frapontillo

0

Nella classe fornitore di contenuti, all'interno query() metodo prima di tornare il cursore, basta commentare il codice che assomigli a questo

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

Sì, ma sto cercando un modo per ottenere lo stesso risultato senza modificare il codice/generatore generato. – frapontillo

Problemi correlati