framework:
WatchDog
- 1.检查是否发生了死锁
-
2.线程是否被任务block
image.png
以AMS 为例查看源码:startOtherServices
检测线程死锁有个很好的方法:
就是一直去尝试获取当前线程的锁,如果一直拿不到那就有可能死锁了
BlockCanary
其实是利用looper机制,如下:
public static void loop() {
final MessageQueue queue = me.mQueue;
for (;;) {
//这里可以手动的设置一个mLogging
final Printer logging = me.mLogging;
if (logging != null) {
logging.println(">>>>> Dispatching to " + msg.target + " " +
msg.callback + ": " + msg.what);
}
//分发消息
msg.target.dispatchMessage(msg);
if (logging != null) {
logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);
}
}
}
其实就是手动给设置一个mLogging,然后去分别去计算
Dispatching 到 Finished 的时间 ,来判断当前handler线程执行的时间。
可以通过如下 方式,就可以更加优雅得计算当前系统任务的耗时时间了。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getMainLooper().setMessageLogging(new Printer() {
@Override
public void println(String x) {
//">>>>> Dispatching to " + msg.target + " " +msg.callback + ": " + msg.what
//可以去计算当前花费的时间 来判断一个任务(handleMessage(Message msg))是的执行时间
// "<<<<< Finished to " + msg.target + " " + msg.callback
}
});
}
网友评论