2011-02-25 15 views
12

Voglio creare un logger personalizzato per l'applicazione Android. La registrazione deve essere eseguita in un thread separato poiché l'applicazione genera molte informazioni. Non voglio utilizzare i log Android poiché ho bisogno di scrivere i registri in un formato specifico. Più thread saranno la scrittura nel file di registro, allo stesso tempo, così ho usato una coda per mantenere i messaggi di logRegistrazione personalizzata per l'applicazione Android

Ecco il codice che ho

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) 
     {     
     } 
    } 
} 

C'è qualche cosa di sbagliato in questo codice? o un modo migliore per creare una coda di registrazione

Grazie, Anuj

risposta

5

Le implementazioni Java BlockingQueue presentano già problemi di sincronizzazione incorporati. L'uso di attesa, notifica e sincronizzazione è ridondante e non n eeded.

Prova imitando l'esempio produttore/consumatore dando nelle 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

Grazie per l'aiuto .... –

2

vorrei usare un Handler - Amo gestore del perché implementano una coda e un thread di messaggi ognuno dei quali è thread-safe. Ciò significa che è possibile creare una classe che estenda un gestore e utilizzi quella classe in tutto il progetto. Con un paio di linee di codice con un gestore, puoi ridurre drasticamente il tuo codice esistente.

la documentazione di Google: http://developer.android.com/reference/android/os/Handler.html

Questo è un esempio molto semplice: http://saigeethamn.blogspot.com/2010/04/threads-and-handlers-android-developer.html

questo è un esempio migliore perché usano "msg.what" per decidere cosa fare (di cui avrete bisogno per diversi livelli di registrazione): https://idlesun.wordpress.com/2010/12/12/android-handler-and-message-tutorial/

+0

Grazie per l'aiuto ... Purtroppo non posso segnare entrambi come risposta –

Problemi correlati