ContentObserver для реализации строки
После "наблюдения" за ContentObserver я заметил, что OnChange до API 16 не передает никаких параметров, поэтому я решил применить его к каждой строке в моем проекте (проект загружает URL-адреса с помощью встроенного DownloadManager)
для каждой строки я создаю новый ContentObserver:
Uri downloadsContentUri = Uri.parse("content://downloads/my_downloads/downloads/" + appDownloadId);
DownloadsObserver downloadsObserver = new DownloadsObserver(downloadId, new Handler());
getContentResolver().registerContentObserver(downloadsContentUri, true, downloadsObserver);
как вы можете видеть, что Uri всегда изменяется по идентификатору строки (это то же самое в БД DownloadManager, которую я проверял), и после этого кода я сохраняю всех наблюдателей в списке, странная вещь - вызывается OnChange только один раз и только для первой загрузки, и никогда больше не вызывается, даже после завершения загрузки..
что я тут делаю не так? Как выполнить наблюдение за каждой строкой в базе данных DownloadManager? (Я системное приложение)
Благодарю.
1 ответ
Я понял!
Это мое решение для ContentObserver для каждой строки, его можно применить к API 15 (15 не имеет OnChange с параметром URI, как в API 16). Конечно, вам нужен новый ContentObserver для каждой строки.
ошибка была в этой линии
Uri downloadsContentUri = Uri.parse("content://downloads/my_downloads/downloads/" + appDownloadId);
он должен быть без "/downloads/", например так:
Uri downloadsContentUri = Uri.parse("content://downloads/my_downloads/" + appDownloadId);
и это мой ContentObserver:
public class DownloadsObserver extends ContentObserver
{
private long mAppDownloadId = 0;
public DownloadsObserver(Handler handler)
{
super(handler);
}
public DownloadsObserver(long appDownloadId, Handler handler)
{
super(handler);
mAppDownloadId = appDownloadId;
}
@Override
public void onChange(boolean selfChange)
{
super.onChange(selfChange);
// Do some work on this row with the id
}
}