主线程用法

时间:2012-01-17 21:26:01

标签: android performance user-interface

我正在尝试确定什么会降低我的应用程序的性能,我正在研究什么是垄断主线程。

我刚刚发现Looper.setMessageLogging并设置了一个客户Printer,以了解主线程的使用方式:

Looper.getMainLooper().setMessageLogging(new LogPrinter(Log.DEBUG, "MainLooper")) {

    private long startTime = 0L;

    @Override
    public void println(String x) {
        if (x.startsWith(">")) {
            startTime = System.nanoTime();
        } else if (x.startsWith("<")) {
            final long duration = System.nanoTime() - startTime;
            x += " (" + (duration / 1000000L) + " ms)";
        }
        super.println(x);
    }

});

这让我发现,是的,有很多代码占用的时间超过500毫秒,有些代码需要几秒钟,这可能就是性能如此糟糕的原因。

D/MainLooper( 1542): >>>>> Dispatching to Handler{433ae6a0} null: 1000
D/MainLooper( 1542): <<<<< Finished to    Handler{433ae6a0} null (952 ms)

现在,我只能理解那些日志消息。我不知道在主线程上采用952 ms的方法是什么。是否有更好的方法来确定花费这么长时间的方法?

1 个答案:

答案 0 :(得分:6)

查看有关使用方法分析的THIS文章,以确定应用运行缓慢的位置。

如果您正在使用Eclipse:在DDMS选项卡中,您将在“设备”窗口中看到一个按钮,其上有一些箭头和一个红色记录图标。这是“开始方法分析”按钮。单击此按钮并启动应用程序并执行导致速度变慢的操作。完成后,再次单击该图标以停止录制。给它几秒钟从手机中提取结果,它会显示一个很好的时间线,显示调用哪些方法以及它们花了多长时间。使用此功能,您可以跟踪哪些方法花费的时间最长,并希望通过您的应用程序减少开销。