В Android есть ли способ получать уведомления об изменении фотографии контакта (через приемник, слушатель и т. д.)?

В моем приложении используется пользовательский макет, отображающий всю контактную информацию, включая фотографии. Он предназначен для обработки очень большого количества контактов (до 1000), и я создал кеш для фотографий контактов, чтобы они загружались намного быстрее. Однако у меня возникают проблемы при обновлении фотографий контактов на телефоне. Поскольку я использую кешированные, новая фотография не отображается в приложении, пока оно не будет принудительно закрыто, а затем перезапущено. И я не хочу использовать что-то вроде метки времени последнего доступа для обновления кэшированных фотографий, потому что это значительно замедлит работу приложения каждый раз, когда требуется обновление.

Итак, в идеале я хотел бы получать уведомления (через что-то вроде широковещательного приемника) всякий раз, когда изменяется фотография контакта, и затем я могу обновить эту фотографию в кеше. Это возможно?


person user496854    schedule 21.04.2013    source источник


Ответы (2)


пользователь CursorLoader для автоматического обновления графического интерфейса. Здесь вы можете ознакомиться с учебным пособием. Очевидно, есть масса других примеров.

person stinepike    schedule 21.04.2013
comment
Я не уверен, как это связано с более быстрой загрузкой фотографий. Я уже делаю все обновления в фоновом потоке, и я уже реализовал кеш фотографий, чтобы сделать это намного быстрее. Проблема заключается в обнаружении изменений фотографий и обновлении кеша, когда они происходят. - person user496854; 21.04.2013
comment
Рекомендуется использовать CursorLoader, поскольку он обновляется асинхронно и автоматически при каждом изменении источника данных. В этом случае ContactsProvider. - person TJ Thind; 21.04.2013

Вы можете использовать ContentObserver.

public class ContractObserv extends Activity {

MyContentObserver observer;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    observer=new MyContentObserver();
    getApplicationContext().getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, observer);

}


  private class MyContentObserver extends ContentObserver {

        public MyContentObserver() {
            super(null);
        }

        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
            Log.d("Androider", "INSIDE ONcHANGE");
        }

    }}

Удивительно, что как только вы запустите его и каждый раз, когда контакт изменится, OnChange вызывается до тех пор, пока вы не отмените его регистрацию.

person Nizam    schedule 03.06.2013
comment
Это срабатывает каждый раз, когда происходит какое-либо изменение контакта, что является чрезмерным. Я хотел бы получать уведомления только тогда, когда фото будет изменено. - person user496854; 03.06.2013
comment
В этом ContentObserver; Есть ли способ получить информацию о контакте, который был добавлен или изменен?? Я хочу создать аналогичный слушатель, но хочу выполнить некоторую операцию с добавленным/измененным контактом. - person Allzhere; 01.10.2013
comment
Это не очень полезно, потому что оно будет вызываться только во время работы вашего приложения, что, вероятно, не происходит при изменении контакта. - person John Patterson; 25.02.2015