2011-02-25 19 views
12

Quiero crear un registrador personalizado para la aplicación de Android. El registro debe hacerse en un hilo separado ya que la aplicación genera mucha información. No quiero usar los registros de Android porque necesito escribir los registros en un formato específico. Múltiples hilos van a escribir en el fichero de registro al mismo tiempo, por lo que he utilizado una cola para mantener los mensajes de registroRegistro personalizado para Android Aplicación

Aquí está el código que tengo

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

¿Hay algo de malo en esto ¿código? o una mejor manera de crear una cola de registro

Gracias, Anuj

Respuesta

5

Las implementaciones de Java BlockingQueue ya tienen problemas de sincronización incorporados. Su uso de wait, notify y synchronized es redundante y no n eeded

Intenta imitar el ejemplo Productor/Consumidor dando en los 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

Gracias por la ayuda .... –

2

me gustaría utilizar un Handler - Me encanta manejador de porque implementan una cola y una cadena de mensajes todo lo cual es seguro para subprocesos. Eso significa que puede crear una clase que amplíe un Manejador y use esa clase en todo su proyecto. Con un par de líneas de código con un controlador, puede reducir el código existente de forma espectacular.

la documentación de Google: http://developer.android.com/reference/android/os/Handler.html

Este es un ejemplo muy sencillo: http://saigeethamn.blogspot.com/2010/04/threads-and-handlers-android-developer.html

este es un mejor ejemplo, porque utilizan "msg.what" para decidir qué hacer (que necesitará para diferentes niveles de registro): https://idlesun.wordpress.com/2010/12/12/android-handler-and-message-tutorial/

+0

Gracias por la ayuda ... por desgracia no puedo marcar tanto de ellos como respuesta –

Cuestiones relacionadas