Android 在 Fragment 中使用 getActivity() NullPointException 的思考和解決辦法


問題:

  1. 使用 AS 在 Fragment 中調用 getActivity() 方法的時候會出現可能為空指針的提醒
  2. 使用 monkey 多次十萬次測試,會出現 getActivity() NullPointException 的情況

思考

  • 為什么會出現這種情況,按說當前 Activity 存在,在 Fragment 中使用 getActivity() 是可以拿到的,不應該為空的

源碼

  1. fragment 的生命周期
    官方 Fragment 生命周期圖

  2. 以下源碼基於 API 26

    1. getActivity 可能為 Null, 跟進源碼,可以看到 getActivity() 是通過 mHost 成員變量獲取 activity ,假如 mHost 為 null , 就返回一個 Null 。
        final public Activity getActivity() {
        return mHost == null ? null : mHost.getActivity();
    }
    
    1. 那成員變量 mHost 是什么呢?什么時候賦值的?
      • mHost: 抽象類 android.app.FragmentHostCallback,繼承之: android.app.FragmentContainer
      • mHost 傳入,是在 Activity 初始化的時候傳入的,源碼如下:
    2. 當調用 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM