关于ContentObserver的“观察”之后我注意到API 16之前的OnChange没有传递任何参数,所以我决定将它实现到我项目的每一行(该项目正在使用内置的DownloadManager下载url)
我正在创建一个新的ContentObserver:
Uri downloadsContentUri = Uri.parse("content://downloads/my_downloads/downloads/" + appDownloadId);
DownloadsObserver downloadsObserver = new DownloadsObserver(downloadId, new Handler());
getContentResolver().registerContentObserver(downloadsContentUri, true, downloadsObserver);
因为你可以看到Uri总是按行id改变(在我检查的DownloadManager DB上它是相同的),在这段代码之后我将所有观察者存储在列表中, 奇怪的是OnChange只被调用一次,仅用于第一次下载,即使在完成下载后也从未再次调用..
我在这里做错了什么? 如何在DownloadManager DB上完成观察每一行? (我是一个系统应用程序)
感谢。
答案 0 :(得分:1)
我明白了!
这是我对每行的ContentObserver的解决方案,这可以应用于API 15(15在API 16上没有带有URI参数的OnChange)。 当然,每行需要一个新的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
}
}