Android中Handler和Looper的dump方法以及Printer接口的使用

阅读更多

看到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");

 

     这样就可以打印出来了。效果不错,大家试试。

你可能感兴趣的:(dump,Printer,LogPrinter)