Android小技巧(三):调试程序执行流程的小技巧
2014-01-06 10:42
344 查看
介绍:在开发的过程中我们经常需要调试程序的执行路径,如我们想知道一个Activity的生命周期方法的调用顺序,我们可能会写如下代码:
[html] view
plaincopy
.....
public void onResume() {
super.onResume();
Log.d("Tag","onResume()");
}
public void onStart() {
super.onStart();
Log.d("Tag","onStart()");
}
public void onPause() {
super.onPause();
Log.d("Tag","onPause()");
}
public void onStop() {
super.onStop();
Log.d("Tag","onStop()");
}
...
这样每次都要输入两个参数,有没有更简便的方法呢?
我们可以通过Thread.currentThread().getStackTrace()获取当前堆栈调用信息,从堆栈信息中可以获取当前调用的java文件名,类名,方法名和代码行号。
于是,我们封装了一个工具类LogHelper。我们只需要使用这个工具类,在跟踪的位置调用LogHelper.trace()方法就可以打印当前调用方法的信息。
例子:打印Activity的生命周期方法执行流程。
LogHelper.java
[java] view
plaincopy
package com.zhuozhuo;
import android.util.Log;
public final class LogHelper {
private static boolean mIsDebugMode = true;//获取堆栈信息会影响性能,发布应用时记得关闭DebugMode
private static String mLogTag = "LogHelper";
private static final String CLASS_METHOD_LINE_FORMAT = "%s.%s() Line:%d (%s)";
public static void trace() {
if (mIsDebugMode) {
StackTraceElement traceElement = Thread.currentThread()
.getStackTrace()[3];//从堆栈信息中获取当前被调用的方法信息
String logText = String.format(CLASS_METHOD_LINE_FORMAT,
traceElement.getClassName(), traceElement.getMethodName(),
traceElement.getLineNumber(), traceElement.getFileName());
Log.d(mLogTag, logText);//打印Log
}
}
}
LogHelperActivity.java
[java] view
plaincopy
package com.zhuozhuo;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class LogHelperActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LogHelper.trace();
}
@Override
public void onStart() {
super.onStart();
LogHelper.trace();
}
@Override
public void onResume() {
super.onResume();
LogHelper.trace();
}
@Override
public void onPause() {
super.onPause();
LogHelper.trace();
}
@Override
public void onStop() {
super.onStop();
LogHelper.trace();
}
@Override
public void onDestroy() {
super.onDestroy();
LogHelper.trace();
}
}
Log打印结果:
总结:
通过使用LogHelper的trace()方法,在调试的时候我们可以非常方便地打印应用的执行流程。
[html] view
plaincopy
.....
public void onResume() {
super.onResume();
Log.d("Tag","onResume()");
}
public void onStart() {
super.onStart();
Log.d("Tag","onStart()");
}
public void onPause() {
super.onPause();
Log.d("Tag","onPause()");
}
public void onStop() {
super.onStop();
Log.d("Tag","onStop()");
}
...
这样每次都要输入两个参数,有没有更简便的方法呢?
我们可以通过Thread.currentThread().getStackTrace()获取当前堆栈调用信息,从堆栈信息中可以获取当前调用的java文件名,类名,方法名和代码行号。
于是,我们封装了一个工具类LogHelper。我们只需要使用这个工具类,在跟踪的位置调用LogHelper.trace()方法就可以打印当前调用方法的信息。
例子:打印Activity的生命周期方法执行流程。
LogHelper.java
[java] view
plaincopy
package com.zhuozhuo;
import android.util.Log;
public final class LogHelper {
private static boolean mIsDebugMode = true;//获取堆栈信息会影响性能,发布应用时记得关闭DebugMode
private static String mLogTag = "LogHelper";
private static final String CLASS_METHOD_LINE_FORMAT = "%s.%s() Line:%d (%s)";
public static void trace() {
if (mIsDebugMode) {
StackTraceElement traceElement = Thread.currentThread()
.getStackTrace()[3];//从堆栈信息中获取当前被调用的方法信息
String logText = String.format(CLASS_METHOD_LINE_FORMAT,
traceElement.getClassName(), traceElement.getMethodName(),
traceElement.getLineNumber(), traceElement.getFileName());
Log.d(mLogTag, logText);//打印Log
}
}
}
LogHelperActivity.java
[java] view
plaincopy
package com.zhuozhuo;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class LogHelperActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LogHelper.trace();
}
@Override
public void onStart() {
super.onStart();
LogHelper.trace();
}
@Override
public void onResume() {
super.onResume();
LogHelper.trace();
}
@Override
public void onPause() {
super.onPause();
LogHelper.trace();
}
@Override
public void onStop() {
super.onStop();
LogHelper.trace();
}
@Override
public void onDestroy() {
super.onDestroy();
LogHelper.trace();
}
}
Log打印结果:
总结:
通过使用LogHelper的trace()方法,在调试的时候我们可以非常方便地打印应用的执行流程。
相关文章推荐
- Android小技巧:LogHelper调试程序执行流程的小技巧
- Android小技巧(三):调试程序执行流程的小技巧
- Android小技巧(三):调试程序执行流程的小技巧
- 调试程序执行流程的小技巧
- Android OTA升级原理和流程分析(八)---升级程序update_binary的执行过程
- Android程序的执行流程
- 编写和调试Android下JNI程序流程
- Android linker可执行程序加载库失败时输出更详细调试信息
- 编写和调试Android下JNI程序流程
- android开机启动到程序执行运行流程简图
- Android OTA升级原理和流程分析(八)---升级程序update_binary的执行过程
- android程序的执行流程分析
- Android程序的执行流程分析
- zend studio调试php程序(使用xdebug),cli,cgi,sapi,php程序执行流程
- Android开发第一讲之目录结构和程序的执行流程
- Android OTA升级原理和流程分析(八)---升级程序update_binary的执行过程
- Android程序的执行流程分析
- Android OTA升级原理和流程分析(八)---升级程序update_binary的执行过程
- Android小技巧——利用TimingLogger打印程序的执行时间
- Android程序的执行流程分析