看到Handler中的dump方法:
public final void dump(Printer pw, String prefix) { pw.println(prefix + this + " @ " + SystemClock.uptimeMillis()); if (mLooper == null) { pw.println(prefix + "looper uninitialized"); } else { mLooper.dump(pw, prefix + " "); } }
可见,如果mLooper不为空,会调用他的dump方法:
public void dump(Printer pw, String prefix) { pw = PrefixPrinter.create(pw, prefix); pw.println(this.toString()); pw.println("mRun=" + mRun); pw.println("mThread=" + mThread); pw.println("mQueue=" + ((mQueue != null) ? mQueue : "(null")); if (mQueue != null) { synchronized (mQueue) { long now = SystemClock.uptimeMillis(); Message msg = mQueue.mMessages; int n = 0; while (msg != null) { pw.println(" Message " + n + ": " + msg.toString(now)); n++; msg = msg.next; } pw.println("(Total messages: " + n + ")"); } } }
这里面都是使用Printer对象pw的方法println去打印:mRun,mThread,mQueue以及queue中包含的
message个数。
看来这个dump函数只是使用了Printer对象进行了打印,打印出Handler以及Looper和Queue中的一些信息。
那么来研究一下Printer吧。
/** * Simple interface for printing text, allowing redirection to various * targets. Standard implementations are {@link android.util.LogPrinter}, * {@link android.util.StringBuilderPrinter}, and * {@link android.util.PrintWriterPrinter}. */ public interface Printer { /** * Write a line of text to the output. There is no need to terminate * the given string with a newline. */ void println(String x); }
原来只是个接口,如果使用的话必须使用具体的实现类才行,那么从他的注释中看,实现类有:
1.android.util.LogPrinter
2.android.util.StringBuilderPrinter
3.android.util.PrintWriterPrinter
4.android.util.PrintStreamPrinter(注释中没有,文档中有,查看Printer的实现类,选中Printer按Ctrl+T即可查看到)
看起来LogPrinter比较脸熟,那么我们就看看这个吧。
/** * Implementation of a {@link android.util.Printer} that sends its output * to the system log. */ public class LogPrinter implements Printer { private final int mPriority; private final String mTag; private final int mBuffer; /** * Create a new Printer that sends to the log with the given priority * and tag. * * @param priority The desired log priority: * {@link android.util.Log#VERBOSE Log.VERBOSE}, * {@link android.util.Log#DEBUG Log.DEBUG}, * {@link android.util.Log#INFO Log.INFO}, * {@link android.util.Log#WARN Log.WARN}, or * {@link android.util.Log#ERROR Log.ERROR}. * @param tag A string tag to associate with each printed log statement. */ public LogPrinter(int priority, String tag) { mPriority = priority; mTag = tag; mBuffer = Log.LOG_ID_MAIN; } /** * @hide * Same as above, but buffer is one of the LOG_ID_ constants from android.util.Log. */ public LogPrinter(int priority, String tag, int buffer) { mPriority = priority; mTag = tag; mBuffer = buffer; } public void println(String x) { Log.println_native(mBuffer, mPriority, mTag, x); } }
代码很精简,实现了println方法,调用了Log.println_native()方法,从名字上看,肯定是native的方法。那么具体Log这个类也是我们搞android的经常用的,它的源码里面最终也是调用了这个native方法做了打印工作。原来是这样,殊途同归!这个函数定义如下:
/** @hide */ public static native int println_native(int bufID, int priority, String tag, String msg);
hide的,我们不能在sdk中直接使用,原来如此,在jni中打印log只不过是直接使用了这个函数而已。
那么这个PrintLog怎么用呢?就这样就可以了:
Printer printer = new LogPrinter(Log.ERROR, “tag”); // print handler and looper info , contain messages count. // 打印出Handler和Looper对象的信息,包含Looper中的Message个数等。 myHandler.dump(printer, "DR prefix");
这样就可以打印出来了。效果不错,大家试试。
相关推荐
Android ,Handler,Looper,Message
在主线程即UI线程外,新建一个Looper线程,并用Messenger和Handler来处理message和posted runnable。程序中,在负线程中默认加了一个3s的线程等来,来帮助理解sent message和post runnable之间的同步机制。所以在按...
Handler和looper详解.
通过自定义Handler、Looper、Message.浅析Android线程间通信原理
handler与looper及messagequeue的简单总结
Handler+Looper+MessageQueue
Android Handler Looper
Android 异步处理 Handler+Looper+MessageQueue深入详解
Handler,Looper和Message的理解和练习
安卓Android源码——HandlerLooper2.rar
安卓Android源码——HandlerLooper1.rar
这次项目用到的主要是Handler Thread Looper,希望对这三者关系还不是很清楚的人能通过我的项目读懂,当然我也不敢保证一定能
消息的类型,在Handler类中的handleMessage方法中得到单个的消息进行处理,在单线程模型下,为了线程通信问题,Android设计了一个Message Queue(消息队列), 线程间可以通过该Message Queue并结合Handler和Looper组件...
Android中handler的使用,处理多线程的使用
android 中Handler 的几种写法,很简单的demo,大神简单修改下,用的是Handler.Callback,的方法
Android的Handler使用方法总结,不错的文档,跟大家分享分享
android event handler and looper
Android应用源码之HandlerLooper2_Android
Android应用源码之HandlerLooper1_Android
Handler,AsyncTask,Looper自定义线程使用示例,自定义线程与UI线程交互,访问UI线程控件