gpt4 book ai didi

android - 同一文件上的多个 FileObserver 失败

转载 作者:太空狗 更新时间:2023-10-29 16:15:29 25 4
gpt4 key购买 nike

在我的应用程序中,我有不同的组件,它们使用 FileObservers 监视 sdcard 中的特定文件。所以有两个 File Observer 实例观察一个文件,比如 abc.xml 的所有事件。

FileObserver fo1 = new FileObserver(new File("/sdcard/abc.xml"));
fo1.startWatching();
FileObserver fo2 = new FileObserver(new File("/sdcard/abc.xml"));
fo2.startWatching();

他们都注册了不同的事件。我的问题是当两个文件观察者同时观看时,我错过了对“fo1”的 onEvent() 的调用。

这是Android系统的限制吗?有什么方法可以克服这个问题?

最佳答案

晚了但可能对其他人有帮助:这是 Android 中的一个错误 - 已报告该问题 here .

因为这让我抓狂,所以我写了一个 FileObserver 的替代品,它通过维护 FileObservers 的主列表来解决这个问题。用这个 FixedFileObserver 替换应用程序中的所有 FileObservers 应该会产生预期的行为。 (健康警告:我没有在所有角落案例中进行非常广泛的测试,但它对我有用)

FixedFileObserver.java

package com.fimagena.filepicker.backend;

import android.os.FileObserver;

import java.io.File;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;


public abstract class FixedFileObserver {

private final static HashMap<File, Set<FixedFileObserver>> sObserverLists = new HashMap<>();

private FileObserver mObserver;
private final File mRootPath;
private final int mMask;

public FixedFileObserver(String path) {this(path, FileObserver.ALL_EVENTS);}
public FixedFileObserver(String path, int mask) {
mRootPath = new File(path);
mMask = mask;
}

public abstract void onEvent(int event, String path);

public void startWatching() {
synchronized (sObserverLists) {
if (!sObserverLists.containsKey(mRootPath)) sObserverLists.put(mRootPath, new HashSet<FixedFileObserver>());

final Set<FixedFileObserver> fixedObservers = sObserverLists.get(mRootPath);

mObserver = fixedObservers.size() > 0 ? fixedObservers.iterator().next().mObserver : new FileObserver(mRootPath.getPath()) {
@Override public void onEvent(int event, String path) {
for (FixedFileObserver fixedObserver : fixedObservers)
if ((event & fixedObserver.mMask) != 0) fixedObserver.onEvent(event, path);
}};
mObserver.startWatching();
fixedObservers.add(this);
}
}

public void stopWatching() {
synchronized (sObserverLists) {
Set<FixedFileObserver> fixedObservers = sObserverLists.get(mRootPath);
if ((fixedObservers == null) || (mObserver == null)) return;

fixedObservers.remove(this);
if (fixedObservers.size() == 0) mObserver.stopWatching();

mObserver = null;
}
}

protected void finalize() {stopWatching();}
}

关于android - 同一文件上的多个 FileObserver 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29227425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com