import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.util.Log;
import android.util.Printer;
public class BlockCanary {
private static final String TAG = BlockCanary.class.getSimpleName();
private Thread mMainThread = Looper.getMainLooper().getThread();
private HandlerThread handlerThread = new HandlerThread("my_block_canary");
private Handler mThreadHandler;
private static final int TIME = 1000;
private static BlockCanary mInstance;
private BlockCanary() {
handlerThread.start();
mThreadHandler = new Handler(handlerThread.getLooper());
Looper.getMainLooper().setMessageLogging(new Printer() {
@Override
public void println(String s) {
if (s.startsWith(">>>>> Dispatching")) {
mThreadHandler.removeCallbacks(printStackTraceRunnable);
mThreadHandler.postDelayed(printStackTraceRunnable, (long) (TIME * 0.8));
} else if (s.startsWith("<<<<< Finished")) {
mThreadHandler.removeCallbacks(printStackTraceRunnable);
}
}
});
}
public static void start() {
if (mInstance == null) {
synchronized (BlockCanary.class) {
if (mInstance == null) {
mInstance = new BlockCanary();
}
}
}
}
private Runnable printStackTraceRunnable = new Runnable() {
@Override
public void run() {
StackTraceElement[] stackTraceElements = mMainThread.getStackTrace();
Log.d(TAG, "卡顿的方法 堆栈信息");
for (StackTraceElement stackTraceElement : stackTraceElements) {
Log.d(TAG, stackTraceElement.toString());
}
}
};
}
```
```