内存泄漏

489 查看

Context

应用级别的context通常在单例中使用,例如一个常用的管理类,其管理Context对象来获取系统服务,但是其不能同时被多个activity获取。由于维护一个activity级别的context引用会导致内存泄露,所以你需要使用application级别的context替代。

在下面这个例子中,如果context是activity级别或者service级别,当其被destroy,其实际不会被gc, 因为CustomManager类拥有了其static应用。

pubic class CustomManager {
    private static CustomManager sInstance;

    public static CustomManager getInstance(Context context) {
        if (sInstance == null) {

            // This class will hold a reference to the context
            // until it's unloaded. The context could be an Activity or Service.
            sInstance = new CustomManager(context);
        }

        return sInstance;
    }

    private Context mContext;

    private CustomManager(Context context) {
        mContext = context;
    }
}

适当地存储context:利用应用级别context
为了避免内存泄露,不要在其生命周期以外持有该对象。检查你的非主线程,pending handlers或者内部类是否持有context对象。

存储应用级别的context的最好的办法是CustomManager.getInstance(),其为单例,生命周期为整个应用的进程。

public static CustomManager getInstance(Context context) {
    if (sInstance == null) {

        // When storing a reference to a context, use the application context.
        // Never store the context itself, which could be a component.
        sInstance = new CustomManager(context.getApplicationContext());
    }

    return sInstance;
}