2011-02-25 70 views
12

我想爲android應用程序創建自定義日誌記錄程序。 由於應用程序會生成大量信息,因此日誌記錄應該在單獨的線程中完成。我不想使用Android日誌,因爲我需要以特定格式編寫日誌。多線程將被寫入在同一時間日誌文件,所以我使用了一個隊列,以保持日誌消息Android應用程序的自定義日誌記錄

下面是代碼,我有

Queue<LogEntry> logQueue = new LinkedBlockingQueue<LogEntry>(); 
LogWritterThread logWritterThread = new LogWritterThread(); 

// to queue the log messages 
public void QueueLogEntry(String message) 
{ 
    LogEntry le = new LogEntry(message); 
    { 
     logQueue.add(le); 
     logQueue.notifyAll(); 
    } 

logWritterThread.start(); 
} 

    class LogWritterThread extends Thread 
{ 
    public void run() 
    { 
     try 
     { 
      while(true) 
      { 
       //thread waits until there are any logs to write in the queue 
       if(logQueue.peek() == null) 
        synchronized(logQueue){ 
         logQueue.wait(); 
        } 
       if(logQueue.peek() != null) 
       { 
        LogEntry logEntry; 
        synchronized(logQueue){ 
         logEntry = logQueue.poll(); 
        } 

        // write the message to file 
       } 
       if(Thread.interrupted()) 
        break; 
      } 
     } 
     catch (InterruptedException e) 
     {     
     } 
    } 
} 

有什麼事情不對的碼?或者更好的方式來創建一個日誌隊列

感謝, Anuj

回答

5

Java BlockingQueue實現已經內置了同步問題。您對wait,notify和synchronized的使用是多餘的,而不是n eeded。

嘗試模仿生產者/消費者例子在BlockingQueue javadoc

class LogEntry { 
    private final String message; 

    LogEntry(String msg) { 
    message = msg; 
    } 
} 

class LogProducer { 
    private final BlockingQueue<LogEntry> queue; 

    LogProducer(BlockingQueue<LogEntry> q) { 
    queue = q; 
    } 

    public void log(String msg) { 
     queue.put(new LogEntry(msg)); 
    } 
} 

class LogConsumer implements Runnable { 
    private final BlockingQueue<LogEntry> queue; 

    LogConsumer(BlockingQueue<LogEntry> q) { 
    queue = q; 
    } 

    public void run() { 
    try { 
     while(true) { 
     LogEntry entry = queue.take(); 
     // do something with entry 
     } 
    } catch(InterruptedException ex) { 
     // handle 
    } 
    } 
} 

class Setup { 
    public static void main(String[] args) { 
    BlockingQueue<LogEntry> queue = new LinkedBlockingQueue<LogEntry>(); 
    LogConsumer c = new LogConsumer(queue); 
    new Thread(c).start(); 

    LogProducer p = new LogProducer(queue); 
    p.log("asynch"); 
    p.log("logging"); 
    } 
} 
+0

感謝您的幫助.... – 2011-02-28 08:23:57

2

我會用一個處理程序 - 我喜歡處理的,因爲他們實現一個隊列和消息線程所有這一切是線程安全的。這意味着您可以創建一個擴展Handler的類並在整個項目中使用該類。通過幾行代碼與處理程序,您可以大幅縮減現有代碼。

谷歌的文檔: http://developer.android.com/reference/android/os/Handler.html

這是一個很簡單的例子: http://saigeethamn.blogspot.com/2010/04/threads-and-handlers-android-developer.html

這是一個更好的例子,因爲他們使用「msg.what」來決定做什麼(你將需要對於不同級別的日誌記錄): https://idlesun.wordpress.com/2010/12/12/android-handler-and-message-tutorial/

+0

感謝您的幫助給...可惜我不能兩者都標記爲答案 – 2011-02-28 08:24:30