Android 主线程检测卡顿耗时,并打印耗时的方法堆栈信息

1,215 阅读1分钟

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")) {
//                    Log.d(TAG, "主线程开始执行任务");
                    mThreadHandler.removeCallbacks(printStackTraceRunnable);
//                    mThreadHandler.postDelayed(runnable, (long) (TIME * 0.8));
                    mThreadHandler.postDelayed(printStackTraceRunnable, (long) (TIME * 0.8));
                } else if (s.startsWith("<<<<< Finished")) {
//                    Log.d(TAG, "主线程结束执行任务");
                    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());
            }
        }
    };
}
```
```