内存泄漏案例分析

案例代码块:
 private static SDCard instance;
    private static SDCard instance;
    private static Context mContext = null;
    /**
     * 保存缓存 Apk 文件夹 .tempApk
     */
    private final String tempApk = "tempApk";
    /**
     * 保存缓存 Apk 文件夹 .tempApk
     */
    private File androidDataTempApk = null;

    /**
     * 初始化 Context
     */
    public static void init(Context context) {
        if (context == null) {
            new Exception("Context Is Null ! ");
        }
        mContext = context;
    }

    public static SDCard getInstance() {

        if (instance == null) {
            instance = new SDCard();
        }

        try {
            instance.initFile();
        } catch (Exception e) {
            e.printStackTrace();
            Loger.e(e.getMessage());
        }
        return instance;
    }

错误原因:

mContext 被static修饰,调用init()方法后,如果不主动清空,则mContext将无法被释放造成内存泄漏

init()方法在MainActivity中通过

ApkUpdate.init(getActivity(), AppDebugConfig.isShowLoger);

public static void init(final Activity activity, final boolean isDebug) {
        Loger.init(isDebug,isDebug);
        ToastUtils.init(activity, isDebug);
        NetWork.init(activity);
        SDCard.init(activity);
        if (activity == null) {
            new Exception("Context is null, can not init !");
        }
    }

被调用,当用户退出登陆 MainActivity销毁后,由于mContext无法释放,MainActivity出现内存泄漏

修改方法:

SDCard 中仅有获取文件夹路径方法用到mContext,通过修改文件路径为AppFilePathConfig中定义好的FILEPATH_UPAPK做为绝对路径,去除mContext的使用。

你可能感兴趣的:(内存泄漏案例分析)