1、解决了webview的内存泄露
ViewParent parent = contetentWebView.getParent();
if (parent != null) {
((ViewGroup) parent).removeView(webView);
}
webView.stopLoading();
// 退出时调用此方法,移除绑定的服务,否则某些特定系统会报错
webView.removeJavascriptInterface("xxx");
webView.getSettings().setJavaScriptEnabled(false);
webView.destroyDrawingCache();
webView.clearHistory();
webView.removeAllViews();
try {
contetentWebView.destroy();
} catch (Throwable ex) {
}
2、解决了ConnectivityManager的内存泄露,类似的泄露还有WifiManager
public static boolean isNetworkAvailable(Context ctx) {
try {
//user activity to get ConnectivityManager will cause memory leak,so here use ApplicationContext instead
if (ctx instanceof Activity) {
ctx = ctx.getApplicationContext();
}
ConnectivityManager cm = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
return (info != null && info.isAvailable());
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
3、内存静态类单例 导致的内存泄露,暂未解决
/**
* JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的。
* 这样当我们第一次调用getInstance的时候,JVM能够帮我们保证instance只被创建一次,并且会保证把赋值给instance的内存初始化完毕。
* 测试发现,single被装载到jvm后,无法被GC回收,此处会造成内存泄露,因为游戏在运行的任何时候都可能调当前类的实例,
* 目前还没想到好的办法释放这个内存
*/
public static A getInstance() {
return AAPIHolder.single;
}
private static class AAPIHolder{
private static final A single = new A ();
}