問題:
- 使用 AS 在 Fragment 中調用 getActivity() 方法的時候會出現可能為空指針的提醒
- 使用 monkey 多次十萬次測試,會出現 getActivity() NullPointException 的情況
思考
- 為什么會出現這種情況,按說當前 Activity 存在,在 Fragment 中使用 getActivity() 是可以拿到的,不應該為空的
源碼
-
fragment 的生命周期
-
以下源碼基於 API 26
- getActivity 可能為 Null, 跟進源碼,可以看到 getActivity() 是通過 mHost 成員變量獲取 activity ,假如 mHost 為 null , 就返回一個 Null 。
final public Activity getActivity() { return mHost == null ? null : mHost.getActivity(); }
- 那成員變量 mHost 是什么呢?什么時候賦值的?
- mHost: 抽象類 android.app.FragmentHostCallback,繼承之: android.app.FragmentContainer
- mHost 傳入,是在 Activity 初始化的時候傳入的,源碼如下:
- 當調用 getActivity() 的時候,Fragment 已經 onDetach() 從 Activity 中。所以會造成空指針。
解決辦法
- 在 BaseFragment 的 onAttach() 方法中獲取 Activity 並賦值給成員變量,然后在需要使用 getActivity() 的地方使用該成員變量就可以了。
參考
https://blog.csdn.net/zqx198810/article/details/24203989?utm_source=tuicool&utm_medium=referral
https://blog.csdn.net/u010897392/article/details/17073605
Fragment 源碼啟動:https://www.jianshu.com/p/f2fcc670afd6
getActivity() 空指針部分:https://www.jianshu.com/p/d9143a92ad94