【Android常见问题】关于内存泄漏(二)

Android常见的问题之一内存泄漏
以下几种情况容易发生内存泄漏的问题:

  • 单例引起内存泄漏:单例的静态特性使得它非常特别,往往它的生命周期和应用的生命周期一样长。如果在使用过程中,不加以限制和管理,那么大量的单例将大量的消耗内存,最终结果就是内存泄漏。如下所示:
`public class MyClass {
private static MyClass instance;
private Context context;
private MyClass (Context context) {
this.context = context;
}
public static MyClass getInstance(Context context) {
if (instance != null) {
instance = new MyClass (context);
}return instance;
}
}`

以上这个例子极其普通,创建单例的时候,我们需要引入一个参数context,传入的这个context的生命周期讲影响单例的生命周期。传入的context往往有两种状况:

  • application的context。我们可以知道,application 的生命周期就是整个应用的生命周期,所以引用application不会有什么问题。
  • Activity的context。如果context所对应的activity已经退出,那么context的引用被单例对象所持有,生命周期等于整个应用的生命周期,也就是说存在Activity退出,但内存却未释放的时候,最终的结果必将是内存泄漏。

  • 非静态内部类创建静态实例:如下实例:

public class MainActivity extends AppCompatActivity {
private static TestResource mResource = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(mResource == null){
mResource = new TestResource();
}//...}class TestResource {//...}
}

这个实例的做法是为了避免重复创建相同的数据资源。虽然避免的重复创建,但这样往往会造成内存泄漏,因为非静态内部类默认持有外部类的引用,同时非静态内部类创建了静态的实例,并且实例的生命周期和应用一样长,所以导致静态实例一直持有Activity的引用,所以Activity的内存资源不能正常的被回收。

  • Handler造成的内存泄漏
    Handler的使用算是非常普遍的了,我们往往在需要解决耗时操作问题上,会利用到Handler,从而避免在主线程中进行耗时操作。但是Handler并不是万能的,一旦使用的不规范,将会造成内存泄漏。由于 Handler 属于 TLS(Thread Local Storage) 变量, 生命周期和 Activity 是不一致的。因此这种实现方式一般很难保证跟 View 或者 Activity 的生命周期保持一致,故很容易导致无法正确释放。

你可能感兴趣的:(android,内存泄露)