有时候,我们想知道一个函数是被谁调用的,这很简单,就输出一个异常即可,因为异常信息里有调用栈。这个技巧很有用,比如在做Android开发时,我想研究一个触摸事件,可以给一个View设置OnTouchListener,了解过触摸事件的朋友应该都知道触摸事件是由dispatchTouchEvent函数分法的,有时我们想看一下这个dispatchTouchEvent里面是如何把事件分发到我们设置的OnTouchListener中,如果直接看dispatchTouchEvent源码,分发现很晕,因为源码太多了,很难看懂,如果想最快的知道调用流程的话,可以在OnTouchListener中打印一个异常,这样就能知道dispatchTouchEvent函数是如何一步步调用到OnTouchListener的,示例如下:
val touchListener = View.OnTouchListener { v, event ->
if (event.action == MotionEvent.ACTION_UP) {
Log.i("ABCD", "哈哈哈", Excetpion("onTouchEvent调用"))
}
false
}
运行你的程序,然后就能看到控制台输出了一个异常,这个异常信息就包含了onTouchEvent的调用栈,有了调用栈再去看源码就会比较轻松一点了。