2011-02-25 3 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 уже встроены проблемы синхронизации. Использование вами ожидания, уведомления и синхронизации является избыточным, а не n eeded.

Попробуйте имитируя Producer/Consumer пример дает в 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

Спасибо за помощь .... –

2

Я хотел бы использовать обработчик - Я люблю Обработчик потому, что они реализуют очереди и поток сообщений, все из которых является поточно. Это означает, что вы можете создать класс, который расширяет Handler и использует этот класс по всему вашему проекту. С помощью нескольких строк кода с обработчиком вы можете резко сократить свой существующий код.

Google в документации: 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

Спасибо за помощь ... К сожалению, я не могу отметить их обоих в качестве ответа –

Смежные вопросы