调试程序执行流程的小技巧-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

调试程序执行流程的小技巧

简介:

介绍:在开发的过程中我们经常需要调试程序的执行路径,如我们想知道一个Activity的生命周期方法的调用顺序,我们可能会写如下代码:

  1. .....  
  2. public void onResume() {  
  3.     super.onResume();  
  4.     Log.d("Tag","onResume()");  
  5. }  
  6.   
  7. public void onStart() {  
  8.     super.onStart();  
  9.     Log.d("Tag","onStart()");  
  10. }  
  11.   
  12. public void onPause() {  
  13.     super.onPause();  
  14.     Log.d("Tag","onPause()");  
  15. }  
  16.   
  17. public void onStop() {  
  18.     super.onStop();  
  19.     Log.d("Tag","onStop()");  
  20. }  
  21.   
  22. ...  

这样每次都要输入两个参数,有没有更简便的方法呢?

我们可以通过Thread.currentThread().getStackTrace()获取当前堆栈调用信息,从堆栈信息中可以获取当前调用的java文件名,类名,方法名和代码行号。

于是,我们封装了一个工具类LogHelper。我们只需要使用这个工具类,在跟踪的位置调用LogHelper.trace()方法就可以打印当前调用方法的信息。

例子:打印Activity的生命周期方法执行流程。

LogHelper.java

  1. package com.zhuozhuo;  
  2.   
  3. import android.util.Log;  
  4.   
  5. public final class LogHelper {  
  6.     private static boolean mIsDebugMode = true;//获取堆栈信息会影响性能,发布应用时记得关闭DebugMode  
  7.     private static String mLogTag = "LogHelper";  
  8.   
  9.     private static final String CLASS_METHOD_LINE_FORMAT = "%s.%s()  Line:%d  (%s)";  
  10.   
  11.     public static void trace() {  
  12.         if (mIsDebugMode) {  
  13.             StackTraceElement traceElement = Thread.currentThread()  
  14.                     .getStackTrace()[3];//从堆栈信息中获取当前被调用的方法信息  
  15.             String logText = String.format(CLASS_METHOD_LINE_FORMAT,  
  16.                     traceElement.getClassName(), traceElement.getMethodName(),  
  17.                     traceElement.getLineNumber(), traceElement.getFileName());  
  18.             Log.d(mLogTag, logText);//打印Log  
  19.         }  
  20.     }  
  21. }  
LogHelperActivity.java
  1. package com.zhuozhuo;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.util.Log;  
  6.   
  7. public class LogHelperActivity extends Activity {  
  8.     /** Called when the activity is first created. */  
  9.       
  10.       
  11.     @Override  
  12.     public void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.main);  
  15.         LogHelper.trace();  
  16.     }  
  17.       
  18.       
  19.     @Override  
  20.     public void onStart() {  
  21.         super.onStart();  
  22.         LogHelper.trace();  
  23.     }  
  24.       
  25.     @Override  
  26.     public void onResume() {  
  27.         super.onResume();  
  28.         LogHelper.trace();  
  29.     }  
  30.       
  31.     @Override  
  32.     public void onPause() {  
  33.         super.onPause();  
  34.         LogHelper.trace();  
  35.     }  
  36.       
  37.     @Override  
  38.     public void onStop() {  
  39.         super.onStop();  
  40.         LogHelper.trace();  
  41.     }  
  42.       
  43.     @Override  
  44.     public void onDestroy() {  
  45.         super.onDestroy();  
  46.         LogHelper.trace();  
  47.     }  
  48. }  

Log打印结果:

总结:

通过使用LogHelper的trace()方法,在调试的时候我们可以非常方便地打印应用的执行流程。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章
最新文章
相关文章