内存泄漏案例分析
2019-03-07 本文已影响0人
在你身边2050
案例代码块:
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的使用。