我正在尝试确定什么会降低我的应用程序的性能,我正在研究什么是垄断主线程。
我刚刚发现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的方法是什么。是否有更好的方法来确定花费这么长时间的方法?
答案 0 :(得分:6)
查看有关使用方法分析的THIS文章,以确定应用运行缓慢的位置。
如果您正在使用Eclipse:在DDMS选项卡中,您将在“设备”窗口中看到一个按钮,其上有一些箭头和一个红色记录图标。这是“开始方法分析”按钮。单击此按钮并启动应用程序并执行导致速度变慢的操作。完成后,再次单击该图标以停止录制。给它几秒钟从手机中提取结果,它会显示一个很好的时间线,显示调用哪些方法以及它们花了多长时间。使用此功能,您可以跟踪哪些方法花费的时间最长,并希望通过您的应用程序减少开销。