有時候程序會重複使用資源,我們只需要創建一個實例就可以,避免重複創建實例,佔用內存。
這看起來,並不會產生內存泄漏,然而非靜態內部類,寫在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