2424import java .util .ArrayList ;
2525import java .util .HashMap ;
2626
27+ /**
28+ * Monitors files (using <a href="http://en.wikipedia.org/wiki/Inotify">inotify</a>)
29+ * to fire an event after files are accessed or changed by by any process on
30+ * the device (including this one). FileObserver is an abstract class;
31+ * subclasses must implement the event handler {@link #onEvent(int, String)}.
32+ *
33+ * <p>Each FileObserver instance monitors a single file or directory.
34+ * If a directory is monitored, events will be triggered for all files and
35+ * subdirectories (recursively) inside the monitored directory.</p>
36+ *
37+ * <p>An event mask is used to specify which changes or actions to report.
38+ * Event type constants are used to describe the possible changes in the
39+ * event mask as well as what actually happened in event callbacks.</p>
40+ *
41+ * <p class="caution"><b>Warning</b>: If a FileObserver is garbage collected, it
42+ * will stop sending events. To ensure you keep receiving events, you must
43+ * keep a reference to the FileObserver instance from some other live object.</p>
44+ */
2745public abstract class FileObserver {
28- /** File was accessed */
46+ /** Event type: Data was read from a file */
2947 public static final int ACCESS = 0x00000001 ;
30- /** File was modified */
48+ /** Event type: Data was written to a file */
3149 public static final int MODIFY = 0x00000002 ;
32- /** Metadata changed */
50+ /** Event type: Metadata (permissions, owner, timestamp) was changed explicitly */
3351 public static final int ATTRIB = 0x00000004 ;
34- /** Writable file was closed */
52+ /** Event type: Someone had a file or directory open for writing, and closed it */
3553 public static final int CLOSE_WRITE = 0x00000008 ;
36- /** Unwrittable file closed */
54+ /** Event type: Someone had a file or directory open read-only, and closed it */
3755 public static final int CLOSE_NOWRITE = 0x00000010 ;
38- /** File was opened */
56+ /** Event type: A file or directory was opened */
3957 public static final int OPEN = 0x00000020 ;
40- /** File was moved from X */
58+ /** Event type: A file or subdirectory was moved from the monitored directory */
4159 public static final int MOVED_FROM = 0x00000040 ;
42- /** File was moved to Y */
60+ /** Event type: A file or subdirectory was moved to the monitored directory */
4361 public static final int MOVED_TO = 0x00000080 ;
44- /** Subfile was created */
62+ /** Event type: A new file or subdirectory was created under the monitored directory */
4563 public static final int CREATE = 0x00000100 ;
46- /** Subfile was deleted */
64+ /** Event type: A file was deleted from the monitored directory */
4765 public static final int DELETE = 0x00000200 ;
48- /** Self was deleted */
66+ /** Event type: The monitored file or directory was deleted; monitoring effectively stops */
4967 public static final int DELETE_SELF = 0x00000400 ;
50- /** Self was moved */
68+ /** Event type: The monitored file or directory was moved; monitoring continues */
5169 public static final int MOVE_SELF = 0x00000800 ;
5270
53- public static final int ALL_EVENTS = ACCESS | MODIFY | ATTRIB | CLOSE_WRITE
71+ /** Event mask: All valid event types, combined */
72+ public static final int ALL_EVENTS = ACCESS | MODIFY | ATTRIB | CLOSE_WRITE
5473 | CLOSE_NOWRITE | OPEN | MOVED_FROM | MOVED_TO | DELETE | CREATE
5574 | DELETE_SELF | MOVE_SELF ;
5675
@@ -128,10 +147,21 @@ public void onEvent(int wfd, int mask, String path) {
128147 private Integer m_descriptor ;
129148 private int m_mask ;
130149
150+ /**
151+ * Equivalent to FileObserver(path, FileObserver.ALL_EVENTS).
152+ */
131153 public FileObserver (String path ) {
132154 this (path , ALL_EVENTS );
133155 }
134156
157+ /**
158+ * Create a new file observer for a certain file or directory.
159+ * Monitoring does not start on creation! You must call
160+ * {@link #startWatching()} before you will receive events.
161+ *
162+ * @param path The file or directory to monitor
163+ * @param mask The event or events (added together) to watch for
164+ */
135165 public FileObserver (String path , int mask ) {
136166 m_path = path ;
137167 m_mask = mask ;
@@ -142,18 +172,42 @@ protected void finalize() {
142172 stopWatching ();
143173 }
144174
175+ /**
176+ * Start watching for events. The monitored file or directory must exist at
177+ * this time, or else no events will be reported (even if it appears later).
178+ * If monitoring is already started, this call has no effect.
179+ */
145180 public void startWatching () {
146181 if (m_descriptor < 0 ) {
147182 m_descriptor = s_observerThread .startWatching (m_path , m_mask , this );
148183 }
149184 }
150185
186+ /**
187+ * Stop watching for events. Some events may be in process, so events
188+ * may continue to be reported even after this method completes. If
189+ * monitoring is already stopped, this call has no effect.
190+ */
151191 public void stopWatching () {
152192 if (m_descriptor >= 0 ) {
153193 s_observerThread .stopWatching (m_descriptor );
154194 m_descriptor = -1 ;
155195 }
156196 }
157197
198+ /**
199+ * The event handler, which must be implemented by subclasses.
200+ *
201+ * <p class="note">This method is invoked on a special FileObserver thread.
202+ * It runs independently of any threads, so take care to use appropriate
203+ * synchronization! Consider using {@link Handler#post(Runnable)} to shift
204+ * event handling work to the main thread to avoid concurrency problems.</p>
205+ *
206+ * <p>Event handlers must not throw exceptions.</p>
207+ *
208+ * @param event The type of event which happened
209+ * @param path The path, relative to the main monitored file or directory,
210+ * of the file or directory which triggered the event
211+ */
158212 public abstract void onEvent (int event , String path );
159213}
0 commit comments