2010-11-26 2 views
4

В классе ContentObserver методу onChange передается логическое selfChange, которое определено как: «true, если обновление вызвано вызовом фиксации на курсоре, который наблюдается».Android: ContentObserver selfChange

Каков правильный способ обновления курсора, чтобы для параметра selfChange установлено значение true? Мой текущий код вообще не ссылается на курсор для обновления, а selfChange всегда является ложным.

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

Мне также хотелось бы получить разъяснения относительно того, что бы и не вызвало самоизменение. Кажется, это воспринимается как само собой разумеющееся в документации, но мне сложно определить, что влияет на нее. – spaaarky21 2013-04-29 20:52:32

ответ

0

Эй, я столкнулся с той же проблемой. Ваш метод onChange() работает нормально? Вы должны просто вызвать то, что вы хотите сделать в области метода onChange().

Это то, что я сделал, и все прошло отлично! Он уведомляет, когда некоторые изменения происходят с курсором.

+0

Спасибо за ответ :) Я переместил весь свой код из вспомогательных методов и непосредственно в метод onChange, но флаг selfChange всегда false. Есть ли у вас какие-либо другие идеи относительно того, что я могу делать неправильно? – mattprecious 2010-12-27 19:56:31

1

У меня возникла такая же проблема. Кажется, у вас есть настроенный ContentProvider.

Пожалуйста, обратите внимание на вашей реализации Вашего метода: ContentProvider.update(Uri uri, ContentValues cv, String selection, String[] selectionArgs);

Моя догадка у вас есть getContext.getContentResolver.notifyChange(Uri uri, ContentValues cv) реализованную в настраиваемой метод обновления, который уведомляет ContentProvider каждый раз это называется, и ContentObserver получает уведомление, и в свою очередь вызовов метод обновления. Таким образом, образуется бесконечный цикл.

Кроме того, у my life with android есть очень подробное, но четкое объяснение того, как оно работает полностью.

Надеюсь, это поможет!

Счастливое кодирование!

4

Андроид не предоставляет способ сделать это с помощью статического метода ContentResolver#update().

Объяснение

Когда ContentResolver#notifyChange(Uri,ContentObserver) вызывается с ContentObserver объекта в качестве наблюдателя, который инициировал изменение, что ContentObserver будет onChange() вызывается с selfChange набором к истинному

Из документов:

void android.content.ContentResolver.notifyChange (Uri uri, наблюдатель ContentObserver)

Параметры:

URI Ури контента, который был изменен.

observer Наблюдатель , инициировавший изменение, может быть пустым. Наблюдатель, что , инициировал изменение, получит уведомление только в том случае, если он имеет , запрошенный для получения уведомлений об изменении самообмена, путем реализации ContentObserver.deliverSelfNotifications() для возврата true.

Так что, если вы звоните notifyChange() из вашего ContentProvider обновления/вставки/удаления методы, которые, в свою очередь вызывается из ContentResolver обновления/вставки/удаления методов, вы не будете иметь ContentObserver ссылку перейти на notifyChange() и так не будет selfChange установить в true.

Обход

Это будет работать, если ContentProvider находится в том же процессе, что и код клиента. Он требует настраиваемого ContentProvider и более сложного/подверженного ошибкам вызова методов update/insert/delete.

В нашем производном ContentProvider мы можем создать собственные методы, которые принимают параметр ContentObserver. Например, если мы хотим иметь update() вызов метода notifyChange() с ContentObserver мы могли бы сделать что-то вроде:

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); 
} 

Чтобы использовать новый метод, вы должны будете получить ContentProvider объект из ContentResolver и вызовите нашего новый update() метод:

ContentProvider cP = getContentResolver().acquireContentProviderClient(URI).getLocalContentProvider(); 
MyContentProvider mCP = (MyContentProvider)cP; 
mCP.update(URI, values, "_id = " + id, null, contentProvider); 
Смежные вопросы