framework:
WatchDog
- 1.檢查是否發(fā)生了死鎖
-
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);
}
//分發(fā)消息
msg.target.dispatchMessage(msg);
if (logging != null) {
logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);
}
}
}
其實就是手動給設置一個mLogging,然后去分別去計算
Dispatching 到 Finished 的時間 ,來判斷當前handler線程執(zhí)行的時間。
可以通過如下 方式,就可以更加優(yōu)雅得計算當前系統(tǒng)任務的耗時時間了。
@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))是的執(zhí)行時間
// "<<<<< Finished to " + msg.target + " " + msg.callback
}
});
}
