У меня есть серия файлов для загрузки. Они хранятся как записи в контент-провайдере. Каждая запись также содержит процент загруженных файлов.
Одно действие отображает список загрузок, каждый файл представляет собой элемент с ProgressBar, показывающий ход загрузки.
Я обновляю этот индикатор выполнения через ContentObserver. Внутри CursorAdaptor я определяю ContentObserver для каждого элемента и сохраняю его как тег соответствующего представления.
Моя проблема сейчас в том, что я не знаю, когда отменить регистрацию таких ContentObservers. Единственный способ, который я нашел, был в содержании активности onDestroy():
for (int i = 0; i < mListView.getChildCount(); i++) {
final View v = mListView.getChildAt(i);
final ContentObserver obs = (ContentObserver) v.getTag();
if (obs != null) {
getContentResolver().unregisterContentObserver(obs);
}
}
Это действительно ужасно. Он вводит зависимость между адаптером и родительской активностью. С другой стороны, незарегистрированные ContentObservers могут предотвратить уничтожение активности, вызывая утечку памяти.
Вы видите лучший способ?
onPause()(и, следовательно, зарегистрировать его вonResume()), потому что вы не всегда можете предвидеть, когда будет вызванonDestroy()или система убьет ваше приложение, даже не вызвав его. - person ozbek   schedule 13.06.2013notifyDataSetInvalidated()для адаптера. - person S.D.   schedule 13.07.2013