首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每行实现ContentObserver

每行实现ContentObserver
EN

Stack Overflow用户
提问于 2014-01-02 20:56:37
回答 1查看 1.7K关注 0票数 0

在对ContentObserver进行了“观察”之后,我注意到API 16之前的OnChange没有传递任何参数,所以我决定将其实现到项目的每一行(该项目正在下载带有内置DownloadManager的url)。

对于每一行,我都要创建一个新的ContentObserver:

代码语言:javascript
复制
    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上每一行的观察?(我是一个系统应用程序)

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-06 08:23:04

这样啊,原来是这么回事!

这是我针对每一行ContentObserver的解决方案,它可以应用于API 15 (15没有像API 16那样具有URI param的OnChange )。当然,每一行都需要一个新的ContentObserver。

错误就在这条线上

代码语言:javascript
复制
 Uri downloadsContentUri = Uri.parse("content://downloads/my_downloads/downloads/" + appDownloadId);

它应该没有“/ like /”,如下所示:

代码语言:javascript
复制
Uri downloadsContentUri = Uri.parse("content://downloads/my_downloads/" + appDownloadId);

这是我的ContentObserver:

代码语言:javascript
复制
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

}
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20891705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档