我想为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
答案 0 :(得分:5)
Java BlockingQueue实现已经内置了同步问题。您对wait,notify和synchronized的使用是多余的,不需要。
中的Producer / Consumer示例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");
}
}
答案 1 :(得分:2)
我会使用Handler - 我喜欢处理程序,因为它们实现了一个队列和一个消息线程,所有这些线程都是线程安全的。这意味着您可以创建一个扩展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/