2012-06-25 25 views
0

我試圖在基於FileExplorer示例的BlackBerry上偵聽文件更改事件,但每當我添加或刪除文件時,它總是顯示「正在使用設備時推遲持久性「,我什麼都抓不到。
這裏是我的代碼:當聽文件更改時在BlackBerry中使用設備的持久性推遲

public class FileChangeListenner implements FileSystemJournalListener{ 

private long _lastUSN; // = 0;  
public void fileJournalChanged() { 
    long nextUSN = FileSystemJournal.getNextUSN(); 
    String msg = null;  
    for (long lookUSN = nextUSN - 1; lookUSN >= _lastUSN && msg == null; --lookUSN) 
    { 
     FileSystemJournalEntry entry = FileSystemJournal.getEntry(lookUSN); 
     // We didn't find an entry 
     if (entry == null) 
     { 
      break; 
     } 
     // Check if this entry was added or deleted 
     String path = entry.getPath();    
     if (path != null) 
     { 
      switch (entry.getEvent()) 
      { 
       case FileSystemJournalEntry.FILE_ADDED: 
        msg = "File was added.";      
        break; 

       case FileSystemJournalEntry.FILE_DELETED: 
        msg = "File was deleted."; 
        break; 
      } 
     } 
    }   
    _lastUSN = nextUSN;   
    if (msg != null) 
    {   
     System.out.println(msg); 
    } 
} 
} 

這裏是來電者:

Thread t = new Thread(new Runnable() { 
      public void run() { 
       new FileChangeListenner(); 
       try { 
        Thread.sleep(5000); 
        createFile(); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       }     
      } 
     }); 
     t.start(); 

創建文件的方法工作得很好:

private void createFile() { 
    try { 
     FileConnection fc = (FileConnection) Connector 
       .open("file:///SDCard/newfile.txt"); 
     // If no exception is thrown, then the URI is valid, but the file 
     // may or may not exist. 
     if (!fc.exists()) { 
      fc.create(); // create the file if it doesn't exist 
     } 
     OutputStream outStream = fc.openOutputStream(); 
     outStream.write("test content".getBytes()); 
     outStream.close(); 
     fc.close(); 
    } catch (Exception e) { 
     System.out.println(e.getMessage()); 
    } 
} 

輸出:

0:00:44.475: Deferring persistence as device is being used. 
0:00:46.475: AG,+CPT 
0:00:46.477: AG,-CPT 
0:00:54.476: VM:+GC(f)w=11 
0:00:54.551: VM:-GCt=9,b=1,r=0,g=f,w=11,m=0 
0:00:54.553: VM:QUOT t=1 
0:00:54.554: VM:+CR 
0:00:54.596: VM:-CR t=5 
0:00:55.476: AM: Exit net_rim_bb_datatags(291) 
0:00:55.478: Process net_rim_bb_datatags(291) cleanup started 
0:00:55.479: VM:EVTOv=7680,w=20 
0:00:55.480: Process net_rim_bb_datatags(291) cleanup done 
0:00:55.481: 06/25 03:40:41.165 BBM FutureTask Execute: net.ri[email protected]d1e1ec79 
0:00:55.487: 06/25 03:40:41.171 BBM FutureTask Finish : net.ri[email protected]d1e1ec79 

我也試圖刪除線程o r直接在模擬器的SD卡中創建或刪除文件,但它沒有幫助。
請告訴我我的問題在哪裏。謝謝

回答

1

你實例化FileChangeListenner,但你永遠不會註冊它,也不要把它作爲一個變量保持在任何地方。你可能需要添加此調用

FileChangeListenner listener = new FileChangeListenner(); 
UiApplication.getUiApplication().addFileSystemJournalListener(listener); 

您可能還需要保持周圍的引用(listener),只要你想接收事件。但也許不是(addFileSystemJournalListener()調用可能會這樣做)。但是,您至少需要致電addFileSystemJournalListener(),否則您將永遠不會收到fileJournalChanged()的回叫。

+0

非常感謝你,我忘了它。我總是實例化新對象作爲我的習慣。 – R4j

+0

@ R4j,這很容易做到!這就是爲什麼有第二雙眼睛看代碼是如此寶貴的:) – Nate