Deaktiviert Benachrichtigungen für einen ContentProvider-URI

8

Ich suche nach einer Möglichkeit, Benachrichtigungen für einen bestimmten ContentProvider s Uri auszusetzen. Der Anwendungsfall ist:

  1. Ein Activity ist an ein CursorAdapter über ein CursorLoader gebunden.
  2. A Service kann viele Batch-Aktualisierungen für eine Zeile in einem ContentProvider durchführen.
  3. Der CursorLoader lädt seinen Inhalt bei jeder Zeilenaktualisierung neu, da der ContentProvider Listener über ContentResolver#notifyChange .

Da ich die ContentProvider nicht bearbeiten kann und ich keine Kontrolle über die Ausführung der Batch-Abfragen habe, gibt es eine Möglichkeit, Benachrichtigungen auf einer Uri (in der ausführenden Service ) bis alle ContentProvider auszusetzen -managed Abfragen wurden ausgeführt? Ich brauche das, um das Flackern zu vermeiden, das durch das ständige erneute Abfragen von CursorLoader verursacht wird.

    
frapontillo 08.04.2013, 06:27
quelle

3 Antworten

3

Sie können diesen Mechanismus in Ihrem Service nicht deaktivieren. Sie sollten jedoch versuchen, sie zu chargen, indem Sie ContentProviderOperations verwenden.

Ich habe einen einleitenden Artikel über ContentProviderOperations geschrieben und zwei weitere Beiträge zu den Methoden withYieldAllowed() und withBackReference() jeweils.

Besonders die letztere sollte für das interessant sein, was Sie hier beschrieben haben.

Mit ContentProviderOperations können Sie mehrere Aktualisierungen und Einfügungen im Stapel verarbeiten. Wenn Sie dann applyBatch() auf Ihrem ContentResolver-Objekt führt der ContentProvider sie alle gleichzeitig aus.

Jetzt habe ich nie den Generator von Nicolas Klein benutzt, aber da er ein sehr, sehr fähiger Android-Entwickler ist und bei Google arbeitet, wette ich, dass der generierte Code die Transaktionen und nutzt notifyChange() nur einmal für den kompletten Stapel am Ende.

Genau das, was Sie brauchen.

    
Wolfram Rittmeyer 08.04.2013, 19:04
quelle
0

Können Sie Ihren eigenen ContentResolver ersetzen?

Sie können versuchen, containResolver mit Ihrer eigenen Klasse zu erweitern, und Sie können die Methode notifyChange überschreiben und Ihre Logik dort umsetzen.

    
QArea 09.04.2013 07:45
quelle
0

Geben Sie in Ihrer Content-Provider-Klasse innerhalb der Methode query() vor dem Zurückgeben des Cursors einfach den Code ein, der ungefähr so ​​aussieht

%Vor%     
1HaKr 09.04.2013 11:54
quelle