靜態類與(Static)以及內存洩漏問題

閱讀時間約 4 分鐘

static 關鍵字主要用於管理記憶體,可用在variables, methods, blocks, nested classed。加上static關鍵字的物件,會在啟動程式當下就會賦予記憶體位置給此物件,後續無論實例化多少次,記憶體的位置都相同。

以class舉例,static class 與 非static class的差別:

  1. 在class內部的class加上static,稱為內部靜態類,而內部靜態類不需要指向外部類的引用,但非靜態內部類需要。
  2. 靜態內部類只能訪問外部類的靜態成員,非靜態內部類能夠訪問外部類的靜態和非靜態成員。
  3. 當進行外部class創建時,非靜態內部類不能脫離外部類實體被創建,非靜態內部類可以訪問外部類的方法和參數。
class OuterClass {
private static String msg = "Hello!";
    private String msg2 = "Moto";    
//加上static的類別
public static class NestedStaticClass {

//靜態class只能調用外部class的靜態成員
public void printMsg() {

System.out.println("msg = " + msg);
        }
}

    //非static類
public class InnerClass {
        //外部不管static還是無static都能調用
public void display() {
            System.out.println("Msg = " + msg + msg2);
}
}

class Main { // 創建static內部類以及非static內部類
    public static void main(String args[]) {
        //創建static內部類實例
OuterClass.NestedStaticClass printer = new OuterClass.NestedStaticClass();
        printer.printMsg();
        //創建非static內部類的方法,需要先創建外部類的實例。
        OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();
        inner.display();
}

Final

與static相同可以用來宣告一個類別、函數或變數。

final 類別:無法被繼承。

final 函數:繼承的子類別無法override。

final變數:變數值無法被修改。

內存洩漏

而有時有沒有加上static會影響到內存泄露的問題,像是以下Handler出現的問題,說由於Handler類沒有設置為static 所以導致了內存洩漏的問題。

raw-image

具體的原因為,因為非static內部類和匿名內部類都可以調用外部類的方法或參數,而當我們要結束外部類(例如MainActivity時),Handler還有消息並沒有被處理完畢,系統會判斷MainActiviy還有可能被使用到,所以不能回收,導致內存洩漏。

raw-image

具體來說,問題出在:

  1. 存在未解決的消息,導致Handler尚未結束。
  2. Handler的生命週期>外部類的生命週期。

所以要想辦法解決上方的問題,以下是可以的幾個解決辦法:

  1. 將Handler設置為Static
  2. 將Handler內部的消息清除(removeCallbacksAndMessages(null))

以上是這次簡單的整理。

參考資料:https://blog.csdn.net/carson_ho/article/details/52693211

https://blog.csdn.net/quanaianzj/article/details/82348982

    avatar-img
    1會員
    37內容數
    留言0
    查看全部
    avatar-img
    發表第一個留言支持創作者!
    dab戴伯的沙龍 的其他內容
    在Android 編譯成功後,在out/target/product/generic會產生與系統對應的映像檔,分別是ramdisk.img關於root文件系統, system.img關於主要的包及庫, userdata.img關於用戶數據,分別對應的目錄為root, system, data映像檔簡
    主要在使用這兩種類型時常常會忘記,所以簡單整理一下內容 Stack Stack<Character> stack = new stack<>(); 屬於LIFO的特性,也就是先進後出的概念,因此所有動作通常是發生在top,可以想像成放球的瓶子,只有頂端一個開口可以拿最上面的那顆球。 可以使用
    物件導向的概念不外乎-> 封裝、繼承、多型、抽象、介面 封裝:在初始化一個class時,將內容物用private的方式包起來,而另外提供接口去給外界使用,可達到保護其資料隱私。 private: 只有自己類別的成員能夠存取 public: 任何人都可以調用 protected: 其父類與子類
    概要 在一個Android程序開始時,只會啟動一個Process(進程),關於此程序中的Activity與Service都會跑在這個Process之內。 而一個Process之中也會有很多個Thread,當一個Process被創造時,也會同時創造出一個Thread(Main Thread),所有
    Activity生命週期 onCreate: 第一次開啟時會進入的流程,只會執行一次 onStart: 將Activity的頁面可視化,並將UI物件初始化使其可和使用者互動 onResume:使用者進行互動時在這個階段,直到使用者切換頁面之後,切換成onPause。 onPause : 有其
    Android 主要從上層(接近使用者)到最底層(接近硬體)順序為: Application -> Framework -> Hal -> Linux Kernel。 Application層:應用程序是在這進行發展,也是使用者直接接觸到的部分。 Framework層:這裡會透過AIDL與Se
    在Android 編譯成功後,在out/target/product/generic會產生與系統對應的映像檔,分別是ramdisk.img關於root文件系統, system.img關於主要的包及庫, userdata.img關於用戶數據,分別對應的目錄為root, system, data映像檔簡
    主要在使用這兩種類型時常常會忘記,所以簡單整理一下內容 Stack Stack<Character> stack = new stack<>(); 屬於LIFO的特性,也就是先進後出的概念,因此所有動作通常是發生在top,可以想像成放球的瓶子,只有頂端一個開口可以拿最上面的那顆球。 可以使用
    物件導向的概念不外乎-> 封裝、繼承、多型、抽象、介面 封裝:在初始化一個class時,將內容物用private的方式包起來,而另外提供接口去給外界使用,可達到保護其資料隱私。 private: 只有自己類別的成員能夠存取 public: 任何人都可以調用 protected: 其父類與子類
    概要 在一個Android程序開始時,只會啟動一個Process(進程),關於此程序中的Activity與Service都會跑在這個Process之內。 而一個Process之中也會有很多個Thread,當一個Process被創造時,也會同時創造出一個Thread(Main Thread),所有
    Activity生命週期 onCreate: 第一次開啟時會進入的流程,只會執行一次 onStart: 將Activity的頁面可視化,並將UI物件初始化使其可和使用者互動 onResume:使用者進行互動時在這個階段,直到使用者切換頁面之後,切換成onPause。 onPause : 有其
    Android 主要從上層(接近使用者)到最底層(接近硬體)順序為: Application -> Framework -> Hal -> Linux Kernel。 Application層:應用程序是在這進行發展,也是使用者直接接觸到的部分。 Framework層:這裡會透過AIDL與Se
    你可能也想看
    Google News 追蹤
    Thumbnail
    徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
    Thumbnail
    隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
    第98章 驚天八卦   1. 第二天,趙敏很早就醒了。 她感覺自己是被餓醒的。 她起床,把窗簾拉開了一點。窗戶的玻璃上,結了一層薄薄的霜花,一切都看不清。 她推開窗戶,探出頭去。 外面,太陽還沒有蹤影,但天色已經大明。從12樓,向下看,社區裡,已經有阿姨早起遛狗了。人是一個紅色的小點,
    Thumbnail
    第79章 從正經到不正經   1. 十月下旬的第一個周日。 下午,張無忌在東宿舍區的籃球場打球。   整個東宿舍區,就一個籃球場,不同宿舍、不同院系的男生,可能因為經常在一起打球而認識,混熟了變成朋友。也可能,因為在一起打球,發生衝突而打起來。當然,還有一種可能,就是打了一架之後,再變成
    Thumbnail
    1. 說不得沖到最近的警察局派出所門口時,天已經完全黑了。 他沖進門,跑到值班警察,或者輔警的面前——因為他也沒有細看,還在喘氣,惹得那位一個很大的白眼:“幹什麼呢?” “我……我有個朋友,剛才在附近打了個小架,聽說是被警察叔叔帶走了。應該是被帶到這裡來了吧?” 那位,指指右邊的走廊:“往裡
    Thumbnail
    本次介紹帶媽媽/妹妹 第一次來東京, 因為疫情後票價高漲, 但都是上班族的我們只能安排連假出遊, 剛好泰獅航用第5航權開了桃園–東京的新航線,讓我們撿到相對便宜的機位啦! 旅遊時間是2023/12/29~2024/1/1 的4天快閃之旅, 我們1人機位+選位+行李20KG大約是1.1萬元-->給大
    Thumbnail
    九年一輪,迎八庄大道公,這次是外公家那邊田心子殺豬公。 看網誌,上次紀錄是2015年5月4日。 9年很快就過去啦。 照理農曆3月15才是正日,不過這次是提前辦。 這次,因為停車技術依然不好,即使過了這麼多年還是沒長進, 所以提早一點到。 最後還是強大的阿惠表姐幫我停好。感
    Thumbnail
    自然生態和動植物在人類文化中扮演著不可或缺的角色,它們不僅是文化的構成要素,還影響著人類的價值觀、生活方式和社會組織,包括其符號象徵意義、對人類生活方式和社會組織的塑造影響,以及對經濟生活和文化創作的重要性。對於維護人類文化的多樣性和永續發展至關重要。
    Thumbnail
    徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
    Thumbnail
    隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
    第98章 驚天八卦   1. 第二天,趙敏很早就醒了。 她感覺自己是被餓醒的。 她起床,把窗簾拉開了一點。窗戶的玻璃上,結了一層薄薄的霜花,一切都看不清。 她推開窗戶,探出頭去。 外面,太陽還沒有蹤影,但天色已經大明。從12樓,向下看,社區裡,已經有阿姨早起遛狗了。人是一個紅色的小點,
    Thumbnail
    第79章 從正經到不正經   1. 十月下旬的第一個周日。 下午,張無忌在東宿舍區的籃球場打球。   整個東宿舍區,就一個籃球場,不同宿舍、不同院系的男生,可能因為經常在一起打球而認識,混熟了變成朋友。也可能,因為在一起打球,發生衝突而打起來。當然,還有一種可能,就是打了一架之後,再變成
    Thumbnail
    1. 說不得沖到最近的警察局派出所門口時,天已經完全黑了。 他沖進門,跑到值班警察,或者輔警的面前——因為他也沒有細看,還在喘氣,惹得那位一個很大的白眼:“幹什麼呢?” “我……我有個朋友,剛才在附近打了個小架,聽說是被警察叔叔帶走了。應該是被帶到這裡來了吧?” 那位,指指右邊的走廊:“往裡
    Thumbnail
    本次介紹帶媽媽/妹妹 第一次來東京, 因為疫情後票價高漲, 但都是上班族的我們只能安排連假出遊, 剛好泰獅航用第5航權開了桃園–東京的新航線,讓我們撿到相對便宜的機位啦! 旅遊時間是2023/12/29~2024/1/1 的4天快閃之旅, 我們1人機位+選位+行李20KG大約是1.1萬元-->給大
    Thumbnail
    九年一輪,迎八庄大道公,這次是外公家那邊田心子殺豬公。 看網誌,上次紀錄是2015年5月4日。 9年很快就過去啦。 照理農曆3月15才是正日,不過這次是提前辦。 這次,因為停車技術依然不好,即使過了這麼多年還是沒長進, 所以提早一點到。 最後還是強大的阿惠表姐幫我停好。感
    Thumbnail
    自然生態和動植物在人類文化中扮演著不可或缺的角色,它們不僅是文化的構成要素,還影響著人類的價值觀、生活方式和社會組織,包括其符號象徵意義、對人類生活方式和社會組織的塑造影響,以及對經濟生活和文化創作的重要性。對於維護人類文化的多樣性和永續發展至關重要。