看到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");
这样就可以打印出来了。效果不错,大家试试。
相关推荐
Handler和Looper是Android系统中两个非常重要的组件,它们之间相互关联,共同实现了Android系统中的消息处理机制。在本文中,我们将对Handler和Looper进行详细的解释,并探讨它们在Android系统中的作用。 一、...
在Android系统中,主线程默认已经有一个运行的Looper,但如果我们需要在自定义线程中使用Handler进行消息通信,就需要手动创建并启动Looper。这是通过调用Looper.prepare()初始化Looper,然后调用Looper.loop()进入...
在Android开发中,Handler...总的来说,理解Handler、Looper和MessageQueue的关系以及它们在Android中的作用,是提升应用程序性能和用户体验的关键。熟练掌握这些组件,有助于编写出更加高效、响应迅速的Android应用。
在主线程即UI线程外,新建一个Looper线程,并用Messenger和Handler来处理message和posted runnable。程序中,在负线程中默认加了一个3s的线程等来,来帮助理解sent message和post runnable之间的同步机制。所以在按...
在Android开发中,`Handler`、`Looper`和`Message`是实现线程间通信和异步处理的关键组件。它们共同构建了一个消息循环系统,使得应用程序可以在不同的线程之间传递和处理消息,尤其是在主线程(UI线程)与工作线程...
【Android 线程间通信:Handler、Looper 和 MessageQueue 深度解析】 在 Android 应用开发中,为了保证界面的流畅性,我们通常需要将耗时操作放在非 UI 线程中执行,然后通过某种机制将结果传递回 UI 线程进行界面...
在Android应用开发中,Handler、Looper和Message是实现线程间通信的重要机制,尤其是在主线程与工作线程之间同步数据和执行UI更新时。Handler、Looper和Message三者结合使用,构建了一个消息处理系统,使得非UI线程...
AsyncTask内部就使用了Handler、Thread和Looper的概念,它会在一个工作线程中执行任务,然后通过回调方法在主线程中更新UI。 总的来说,理解和熟练运用Handler、Thread和Looper对于Android开发者至关重要,因为它们...
Handler、Looper和MessageQueue是Android异步处理机制中的核心组件,它们共同构建了一个消息传递系统,使得在不同线程间进行数据交换变得可能。下面我们将深入探讨这三个组件的工作原理及其在实际开发中的应用。 ...
总之,`Looper`是Android系统中的核心组件之一,它与`Handler`和`Message`共同构建了强大的异步处理机制。理解和熟练运用`Looper`,对于开发高效、流畅的Android应用程序至关重要。通过阅读指定的博客文章,你可以更...
在 Android 开发中,Looper 对象的使用非常频繁,因此需要非常了解 Looper 对象的机制和使用方法,以便更好地开发 Android 应用程序。 Android 官方文档中对 Looper 的介绍中,Looper 被描述为一个用于运行消息...
这个压缩包“安卓Android源码——HandlerLooper2.rar”可能会包含对这些概念的实例解析,比如如何自定义`Handler`,如何在子线程中使用`Looper`,以及如何调试和优化消息传递等。通过学习这些源码,开发者可以更深入...
本文将深入探讨Android中的Handler机制及其使用方法。 首先,理解Handler的基本概念。Handler是Android消息处理系统的一部分,它与Looper和Message紧密协作,用于在不同线程之间传递消息和执行任务。通常,主线程...
本文将深入探讨Android中的三种主要线程模式:Handler、Thread以及Looper,并结合源码分析它们的工作原理。 首先,我们来理解一下Android应用的基本运行环境。Android系统默认在主线程(UI线程)中执行所有的用户...
在有 Looper 的线程中,我们可以使用 Handler 来发送和处理消息。Handler 是一个抽象的概念,它可以将消息发送到 Looper 中,并且可以处理 Looper 中的消息。 Android 中的多线程模型可以分为以下几种: 1. 主线程...
总结来说,Handler是Android中处理多线程和UI同步的核心工具,理解其工作原理和使用方法对于开发高效、稳定的Android应用至关重要。通过熟练掌握Handler,开发者可以更好地控制应用的执行流程,确保UI响应性和性能。...
在Android开发中,`Handler`、`Looper`和`Message`是实现线程间通信的重要组件,它们共同构建了一个消息处理机制。理解这三个概念对于优化应用程序的性能和用户体验至关重要。 `Handler`(处理器)是Android中的一...
在Android应用开发中,Handler、Looper和Message是实现线程间通信的重要机制,尤其是在主线程与工作线程之间传递数据和执行任务时。本压缩包"Android应用源码之HandlerLooper2_Android.zip"可能包含了关于这个主题的...
在Android系统中,`Handler`、`Looper`和`MessageQueue`是三个核心组件,它们共同构成了Android消息处理机制,使得应用程序能够实现线程间的通信和异步任务执行。这个`HandlerLooper1.rar`文件可能包含了对这些概念...
基本的`Handler`使用通常涉及到创建`Handler`对象,然后在后台线程中通过`Looper`和`Message`与之交互。以下是一个简单的例子: ```java // 在主线程中创建Handler Handler mHandler = new Handler() { @...