2011-02-25 5 views
12

アンドロイドアプリケーションのカスタムロガーを作成したいと思います。 アプリケーションが多くの情報を生成するため、ログは別のスレッドで実行する必要があります。私は特定の形式でログを書き込む必要があるので、私は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ではなく去った。

助けを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

私はハンドラを使用するロギングキューを作成するか、より良い方法。つまり、ハンドラを拡張してプロジェクト全体でそのクラスを使用するクラスを作成できます。数行のコードをハンドラとともに使用すると、既存のコードを大幅に縮小することができます。

Googleのドキュメント: http://developer.android.com/reference/android/os/Handler.html

は、これは非常に単純な例である:彼らは何をすべきかを決定するために、「msg.what」を使用しているため、これは、より良い例です http://saigeethamn.blogspot.com/2010/04/threads-and-handlers-android-developer.html

(あなたが必要となります https://idlesun.wordpress.com/2010/12/12/android-handler-and-message-tutorial/

+0

おかげで与えプロデューサ/コンシューマの例を模倣してみ...残念ながら私は答えとして助けを –

関連する問題