ContentObserver每行实现

时间:2014-01-02 20:56:38

标签: android contentobserver android-download-manager

关于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上完成观察每一行? (我是一个系统应用程序)

感谢。

1 个答案:

答案 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

}
}