ContentObserver onChange()方法被多次调用

时间:2014-02-25 11:05:07

标签: android contentobserver

我要求跟踪在设备上创建的.jpg类型的新图像文件。 我使用ContentObserver上的MediaStore使用MediaStoreObserver下面的onChange()来完成此操作, 在我的一项服务中注册相同的内容。

我注意到MediaStore方法被多次调用以创建单个文件。 我知道创建的媒体文件会在onChange()的许多表中更新,因此MediaStore被多次调用。

我的问题:如何注册 private class MediaStoreObserver extends ContentObserver { public MediaStoreObserver() { super(null); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); //check image file changes in MediaStore readFromMediaStore(_context,MediaStore.Images.Media.EXTERNAL_CONTENT_URI); } } //register for external media changes for image files if(mediaStoreObserver!=null){ _context.getContentResolver().registerContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, false,mediaStoreObserver); 仅用于图像文件创建/编辑操作?

- 提前谢谢, 馒头

{{1}}

2 个答案:

答案 0 :(得分:3)

简短回答:您不能,只要有以下内容发送notifyChange(收到观察员onChange)的提供商:更新/插入/删除

更长的回答:这是为了实现您想要的目标(如何注册到MediaStore以进行ONLY图像文件的创建/编辑操作?):

启动时从MediaStore读取图像表,并将_data列(文件路径)存储在已排序的collection中,带有路径(字符串)的已排序collection。每当您收到onChange调用时,请创建上述排序的新集合,然后循环遍历新集合并使用二进制搜索搜索您创建的原始集合(因为集合已排序,我们希望保留时间复杂性低)。这将导致一个非常有效的实现,运行时间为O(n * logn)。

或伪代码:

1. Read current image columns from media store (the `_data column as projection)
2. Store result in a collection, with string type
3. Sort collection
4. Upon `onChange` is received, make a new collection as step 1-3
5. Loop over collection created in 4 and search each string you take out with 
binary search in the sorted collection you got from step 3, if item is not found 
then the item is new
6. Make the collection in 4 the current cached version of mediastore 
7. Time complexity is O(n*log n) for the above algorithm 
更新文件部分的

编辑每当我在步骤5中的搜索命中时,我会从MediaStore读取日期修改字段,这意味着您实际应该存储两个文件(uri)和修改日期在数据类中,但搜索查找使用文件路径。每当找到文件时,你应该检查修改的日期是否匹配,如果没有,那么它是一个更新的文件。

答案 1 :(得分:0)

我遇到了同样的问题,并通过从我的super.onchange覆盖中移除onchange来解决此问题。