2010-11-26 6 views
4

In der ContentObserver-Klasse wird der Methode onChange ein boolescher selfChange übergeben, der wie folgt definiert ist: "true, wenn das Update durch einen Aufruf zum Festschreiben an dem Cursor verursacht wurde, der beobachtet wird."Android: ContentObserver selfChange

Was ist der richtige Weg, um den Cursor zu aktualisieren, so dass SelfChange auf True festgelegt ist? Mein aktueller Code referenziert den Cursor überhaupt nicht für ein Update und selfChange ist daher immer falsch.

ContentValues values = new ContentValues(); 
values.put("date", date.getTime()); 
getContentResolver().update(URI, values, "_id = " + id, null); 
+1

Ich möchte auch etwas Klärung darüber, was SelfChange würde und würde nicht wahr sein. Es scheint in der Dokumentation selbstverständlich zu sein, aber es fällt mir schwer herauszufinden, was das bewirkt. – spaaarky21

Antwort

0

Hey ich konfrontiert das gleiche Problem. Hat Ihre onChange() Methode funktioniert? Sie müssen einfach das, was Sie tun möchten, innerhalb des Methodenbereichs onChange() aufrufen.

Das habe ich gemacht, und es hat gut funktioniert! Es benachrichtigt, wenn eine Änderung am Cursor auftritt.

+0

Danke für die Antwort :) Ich habe meinen Code aus Hilfsmethoden und direkt in die OnChange-Methode verschoben, aber das selfChange-Flag ist immer falsch. Hast du andere Ideen, was ich falsch machen könnte? – mattprecious

+0

Ich glaube nicht, ob es falsch zurückgibt. Es kommt darauf an, ob der Code die onChange() -Methode erreicht, wenn er die onChange() -Methode eingibt, weil er eine Änderung entdeckt hat. Mine gibt auch false zurück und es ist in Ordnung. Ich mache seine Arbeit in der onChange() Methode. Überprüfen Sie also, ob der Code die onChange() -Methode eingibt, wenn ja, dann ist es in Ordnung, legen Sie dort, was Sie tun wollen, im Falle einer Änderung. Fügen Sie eine Protokollnachricht in die onChange() -Methode ein, um zu überprüfen, ob sie die Methode erreicht. – rogcg

+0

Die OnChange-Methode wird erfolgreich aufgerufen. Das Problem, mit dem ich konfrontiert bin, ist, dass mein onChange-Code den Cursor ändert, der dann die onChange-Methode erneut auslöst (und wieder und wieder ...). Ich habe eine Problemumgehung implementiert, um die unendliche Aufrufschleife zu vermeiden, aber nach meinem Verständnis soll selfChange wahr sein, wenn mein Cursor die Änderung verursacht. Dies würde es mir ermöglichen, meinen gesamten Code innerhalb von if (! SelfChange) {...} zu speichern, anstatt die zuletzt geänderten IDs und ähnliches zu verfolgen. – mattprecious

1

Ich hatte das gleiche Problem. Es scheint, dass Sie einen angepassten ContentProvider haben.

Bitte nehmen Sie sich einen Blick auf Ihre Implementierung Ihrer Methode: ContentProvider.update(Uri uri, ContentValues cv, String selection, String[] selectionArgs);

Meine Vermutung ist, dass Sie getContext.getContentResolver.notifyChange(Uri uri, ContentValues cv) in Ihrer individuellen Update-Methode implementiert haben, die Contentprovider jedes Mal, es heißt, und ContentObserver erhält die Benachrichtigung, und wiederum Anrufe benachrichtigen die Aktualisierungsmethode So entsteht die Endlosschleife.

Auch hat my life with android eine sehr detaillierte und doch klare Erklärung, wie es funktioniert.

Hoffe es hilft!

Glückliche Codierung!

4

Das Android-Framework bietet keine Möglichkeit, dies über die statische Methode ContentResolver#update() zu tun.

Erklärung

Wenn ContentResolver#notifyChange(Uri,ContentObserver) mit dem ContentObserver Objekt als Beobachter genannt, der die Änderung initiiert, dass ContentObserveronChange() mit selfChange Satz auf true

Von der Dokumentation genannt haben:

void android.content.ContentResolver.notifyChange (Uri uri, Beobachter von ContentObserver)

Parameter:

uri Die uri des Inhalts, geändert wurde.

Beobachter Der Beobachter, der die Änderung ausgelöst hat, kann null sein. Der Beobachter, der die Änderung initiierte, erhält nur dann die Benachrichtigung, wenn er angefordert hat, um Benachrichtigungen zur Eigenänderung zu empfangen, indem er ContentObserver.deliverSelfNotifications() implementiert, um "True" zurückzugeben.

Also, wenn Sie notifyChange() aus Ihrer ContentProvider Update/Insert-Aufruf/Löschen Methoden, die wiederum von den ContentResolver Update/Insert aufgerufen werden/löschen Methoden, werden Sie nicht haben den ContentObserver Bezug auf einen Pass zu spielen notifyChange() und so wird nicht selfChange auf wahr gesetzt haben.

Umgehung

Das funktioniert, wenn die Contentprovider im selben Prozess wie der Client-Code ist. Es erfordert einen benutzerdefinierten ContentProvider und einen komplexeren/fehleranfälligen Aufruf der update/insert/delete-Methoden.

Wir können benutzerdefinierte Methoden in unserem abgeleiteten ContentProvider erstellen, die einen ContentObserver als Parameter nehmen. unsere

public class MyContentProvider extends ContentProvider { 

    @Override 
    public int update(Uri uri, ContentValues values, String selection, 
       String[] selectionArgs) { 
     // Just call our new method with 'null' as the ContentObserver 
     update(uri,values,selection,selectionArgs,null); 
    } 

    public int update(Uri uri, ContentValues values, String selection, 
       String[] selectionArgs, ContentObserver changeOriginator){ 
     // Do the update 
     ... 
     // Notify the change with the ContentObserver that wants to ignore it 
     getContext().getContentResolver().notifyChange(uri,changeOriginator); 
} 

Zur Verwendung der neuen Methode, werden Sie haben, um das ContentProvider Objekt aus dem ContentResolver und rufen: Zum Beispiel, wenn wir die update() Methodenaufruf notifyChange() mit dem ContentObserver wir tun, wäre so etwas wie haben wollte neu update() methode:

ContentProvider cP = getContentResolver().acquireContentProviderClient(URI).getLocalContentProvider(); 
MyContentProvider mCP = (MyContentProvider)cP; 
mCP.update(URI, values, "_id = " + id, null, contentProvider); 
Verwandte Themen