Skip to content

Instantly share code, notes, and snippets.

@wyon
Last active February 25, 2021 05:56
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wyon/e06431ee5ae48e216d620fc93e5c9564 to your computer and use it in GitHub Desktop.
Save wyon/e06431ee5ae48e216d620fc93e5c9564 to your computer and use it in GitHub Desktop.
检测应用在UI线程的卡顿,打印出卡顿时调用堆栈。
public class BlockDetect {
// BlockDetectByPrinter
public static void start() {
Looper.getMainLooper().setMessageLogging(new Printer() {
private static final String START = ">>>>> Dispatching";
private static final String END = "<<<<< Finished";
@Override
public void println(String x) {
if (x.startsWith(START)) {
LogMonitor.getInstance().startMonitor();
}
if (x.startsWith(END)) {
LogMonitor.getInstance().removeMonitor();
}
}
});
}
// BlockDetectByChoreographer
// public static void start() {
// Choreographer.getInstance()
// .postFrameCallback(new Choreographer.FrameCallback() {
// @Override
// public void doFrame(long l) {
// if (LogMonitor.getInstance().isMonitor()) {
// LogMonitor.getInstance().removeMonitor();
// }
// LogMonitor.getInstance().startMonitor();
// Choreographer.getInstance().postFrameCallback(this);
// }
// });
// }
private static class LogMonitor {
private static LogMonitor sInstance = new LogMonitor();
private HandlerThread mLogThread = new HandlerThread("log");
private Handler mIoHandler;
private static final long TIME_BLOCK = 1000L;
private LogMonitor() {
mLogThread.start();
mIoHandler = new Handler(mLogThread.getLooper());
}
private static Runnable mLogRunnable = new Runnable() {
@Override
public void run() {
StringBuilder sb = new StringBuilder();
StackTraceElement[] stackTrace = Looper.getMainLooper().getThread().getStackTrace();
for (StackTraceElement s : stackTrace) {
sb.append(s.toString() + "\n");
}
Log.e("TAG", sb.toString());
}
};
public static LogMonitor getInstance() {
return sInstance;
}
public boolean isMonitor() {
return mIoHandler.hasCallbacks(mLogRunnable);
}
public void startMonitor() {
mIoHandler.postDelayed(mLogRunnable, TIME_BLOCK);
}
public void removeMonitor() {
mIoHandler.removeCallbacks(mLogRunnable);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment