一、 背景
最近在新需求中,遇到一个crash问题,具体堆栈是:
android.view.InflateException: Binary XML file line #227: Error inflating class XXXView
at android.view.LayoutInflater.createView(LayoutInflater.java:633)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
...
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
at android.view.LayoutInflater.createView(LayoutInflater.java:607)
...
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.os.Handler.removeCallbacks(java.lang.Runnable)' on a null object reference
at XXXView.cancelAnim(XXXView.kt:379)
at XXXView.onVisibilityChanged(XXXView.kt:103)
at android.view.View.dispatchVisibilityChanged(View.java:8895)
at android.view.ViewGroup.dispatchVisibilityChanged(ViewGroup.java:1178)
at android.view.View.setFlags(View.java:9990)
at android.view.View.<init>(View.java:4231)
at android.view.ViewGroup.<init>(ViewGroup.java:529)
at android.view.ViewGroup.<init>(ViewGroup.java:525)
at androidx.constraintlayout.widget.ConstraintLayout.<init>(ConstraintLayout.java:580)
at XXXView.<init>(XXXView.kt:32)
at XXXView.<init>(XXXView.kt:31)
at XXXView.<init>(XXXView.kt)
...
该异常堆栈对应的业务伪代码为:
class XXXView @JvmOverloads constructor(
context: Context,
attr: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attr, defStyleAttr) {
private val mainHandler = Handler()
private val actionDismiss = Runnable {
...}
override fun onVisibilityChanged(changedView: View, visibility: Int) {
super.onVisibilityChanged(changedView, visibility)
if (changedView != this) return