【內存泄露】Android內存泄漏---非靜態內部類創建靜態實例

有時候程序會重複使用資源,我們只需要創建一個實例就可以,避免重複創建實例,佔用內存。


這看起來,並不會產生內存泄漏,然而非靜態內部類,寫在Activity裏就會出現問題了,Activity的生命週期導致的內存泄漏。


舉個栗子:

public class MainActivity extends AppCompatActivity {

    private static Inner inner= null;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        if(inner== null){

            inner= new Inner();

        }

        //...

    }

    class Inner{

        //...

    }

}


請注意要點:

1.只要非靜態內部類沒有銷燬,MainActivity就不會被回收(原因請看第2點),所以MainActivity的資源都不會回收,導致內存泄漏。

2.非靜態內部類默認持有外部類引用,如果java基礎學的不好的,請看一下這個鏈接:http://www.cnblogs.com/dolphin0520/p/3592498.html


分析代碼的問題:

1.非靜態內部類Inner,生命週期和Application一樣,只要程序沒關閉,Inner就不會被銷燬,對號入座:對應要點1。

2.非靜態內部類Inner,對號入座:對應要點2。

3.所以內存泄漏問題肯定是存在的。


解決代碼問題:

1.將非靜態內部類Inner改成靜態內部類。

2.將非靜態內部類Inner提取出來,封裝成單例。

3.採用第2種方式,請參照http://blog.csdn.net/qq_29266921/article/details/54846845

發佈了80 篇原創文章 · 獲贊 65 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章