CalendarView icon indicating copy to clipboard operation
CalendarView copied to clipboard

CalendarView 中在 onAttachWindow 执行初始化可能导致后续操作 NPE

Open rosuH opened this issue 3 years ago • 0 comments

源码中存在:

https://github.com/huanghaibin-dev/CalendarView/blob/65f747a564c6a7d8b1fc489ca6cac42c9f002be0/calendarview/src/main/java/com/haibin/calendarview/CalendarView.java#L1200-L1210

View 只会在 Activity/Fragment 执行到 onResume 的时候回调 onAttachedToWindow 并执行绘制操作。所以对于自行控制 Fragment 生命周期的情况下,可能导致 NPE 异常。

  1. onCreate 执行网络请求
  2. Fragment 不可见,不执行 onResume。故而子 View 亦不会被回调 onAttachedToWindow
  3. CalendarViewonAttachedToWindowmParent 的赋值操作不会被执行。

此时调用任何操作 mParent 属性的方法,都将导致 NPE 异常。比如 com.haibin.calendarview.CalendarView#setRange :

https://github.com/huanghaibin-dev/CalendarView/blob/65f747a564c6a7d8b1fc489ca6cac42c9f002be0/calendarview/src/main/java/com/haibin/calendarview/CalendarView.java#L248-L267

里面的 mWeekPager.updateRange():

https://github.com/huanghaibin-dev/CalendarView/blob/65f747a564c6a7d8b1fc489ca6cac42c9f002be0/calendarview/src/main/java/com/haibin/calendarview/WeekViewPager.java#L151-L171

会有mParentLayout.updateSelectWeek(i); 调用。

是不是可以直接在 CalendarView 创建的时候直接获取 mParentLayout

rosuH avatar Jan 27 '21 08:01 rosuH