- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在我的应用程序中,我有不同的组件,它们使用 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/
我正在使用 FileObserver 来查看 android 中的文件夹。当用户在这个文件夹中修改或创建一个新文件时,FileObserver 应该对这个文件做一些事情。 问题是通过使用子句 File
我有一个目录,用户可以将文件从另一台设备传输到该目录。我有一个 FileObserver 监视那个目录。但我不知道要注意什么。我需要知道文件何时完成传输,以便将其移动到另一个位置。那么我要注意什么事件
我遇到了以下问题: 在我的 Activity 中,我有一个列出外部文件目录内容的 ListView 。我希望列表在内容发生任何变化时立即更新,所以我有: public class FileAdapte
我在 Activity 的 onCreate 函数中声明了 1 个 fileObserver。这是第一次,每当您对文件目录进行任何更改(具体而言,我删除了文件夹)时,观察者都会工作并广播一个 Inte
我正在一个家庭更换应用程序的主要 Activity 中实现一个文件观察器。它会耗尽电池电量吗? 谢谢 最佳答案 FileObserver 不应耗尽电池电量。 FileObserver 监听 iNoti
我需要监控文件夹中的所有文件,当文件打开时(FileObserver.OPEN)我想执行一个方法。问题是有时,FileObserver 实例被 GC 收集,我试过这个: final MyFil
这是我的代码: public class SyncNotifyService extends Service { private final static String TAG = "File
好的,这很简单:我有一个 FileObserver 类来观察带有音乐的文件夹。所以我实现了 onEvent 和所有这些东西,但是当我使用文件管理器将文件移动或粘贴到该文件夹时,我得到的不是 Fil
根据文档, "Each FileObserver instance monitors a single file or directory. If a directory is monitored,
我怀疑我已经知道这个问题的答案了,但我还是想请教专家。 是否可以使用 FileObserver 类来监视对属于其他应用程序的文件的更改(即/data 目录中不属于实现 FileObserver 的应用
在 Android FileObserver 中,当在观察文件夹中创建目录或在该文件夹中删除目录时,我会收到一些奇怪的事件编号,例如 (1073742080, 1073742336)。 对于文件夹的创
在我的 Android 应用程序中,我想检测目录中的事件。这是代码: String path = Environment.getExternalStorageDirectory()
我很想知道是否有比 FileObserver 更好的方法来监视目录的文件更改/创建/删除。 FileObserver 需要持续引用它,这需要持续运行的服务,这很困难,也是一种不好的做法,对吧? 对于如
我想在服务中使用 FileObserver 观察是否在 /storage/emulated/0/DCIM/Camera 中添加了任何文件/文件夹,但它不起作用。如果我的代码有什么问题请告诉我🙏。这是
我需要在一个目录上设置一个 FileObserver。观察期链接到一个长时间运行的 Activity ,长时间运行是因为它有一个包含很多页面的 ViewPager。我没有将 FileObserver
我正在使用 FileObserver观察目录的变化。该过程在 90% 的时间里运行良好,但偶尔会失败。 这是一个 logcat 的工作示例: 04-23 21:12:03.873: V/ItemObs
在我的应用程序中,我有不同的组件,它们使用 FileObservers 监视 sdcard 中的特定文件。所以有两个 File Observer 实例观察一个文件,比如 abc.xml 的所有事件。
我想监控android系统文件的变化 "/sys/class/net/eth0/operstate" 用于监控以太网状态。 我写了一个 File Observer 类,但我没有收到任何事件public
我正在编写一个使用 android 中的 fileobserver 的应用程序。当我以任何方式修改文件(创建等)时,它应该上传。为了实现一个队列并防止使用线程等耗尽内存,我想使用 IntentServ
我现在正在编写 FileObserver 代码。我有以下代码,如果运行它,我将收到 NullPointerException。 public class FileModificationService
我是一名优秀的程序员,十分优秀!