0

在“观察”了 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 上每一行的观察?(我是系统应用)

谢谢。

4

1 回答 1

1

我知道了!

这是我针对每一行的 ContentObserver 的解决方案,这可以应用于 API 15(15 没有像 API 16 上的 OnChange 和 URI 参数)。当然,每一行都需要一个新的 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

}
}
于 2014-01-06T08:23:04.613 回答