内存泄漏优化---静态变量导致内存泄漏
来源:互联网 发布:鼠标控制软件 编辑:程序博客网 时间:2024/06/16 12:02
1、要不怎么说static关键字要慎用呢?来看看下面这段代码,Context对象为静态的,那么Activity就无法正常销毁,会常驻内存。
public class MainActivity extends Activity{public static Context mContext;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mContext = this;}}
解决办法:1使用Application的Context。 2慎用statistic关键字
2、单例模式导致内存的泄漏
静态变量导致的内存泄漏太过明显,而单例模式带来的内存的泄漏容易被忽略。
public class MyDBHelper extends SQLiteOpenHelper { public static final String DB_NAME = "mydb.db"; public static final int DATABASE_VERSION = 1; public static MyDBHelper instance = null; private static final Object mMutex = new Object(); private static final String DB_TABLE_STUDENT = "students"; private static final String DB_TABLE_TEACHER = "teacher"; private String studentTableSql = "CREATE TABLE IF NOT EXISTS students (id integer primary key autoincrement,name varchar(10),age varchar(10),sex varcher(10))"; private String teacherTableSql = "CREATE TABLE IF NOT EXISTS teacher (id integer primary key autoincrement,name varchar(10),age varchar(10))"; /** * 功能描述:单例模式创建MyDBHelper实例 * * @param context * @return */ public static MyDBHelper getInstance(Context context) { if (instance == null) { synchronized (mMutex) { if (instance == null) { instance = new MyDBHelper(context); } } } return instance; } public MyDBHelper(Context context) { super(context, DB_NAME, null, DATABASE_VERSION); } /** * 方法描述: 构造方法 * * @param context 上下文 * @param name 数据库名称 * @param factory * @param version */ public MyDBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } /** * 方法描述:创建数据库 * * @param db */ @Override public void onCreate(SQLiteDatabase db) { db.execSQL(studentTableSql); db.execSQL(teacherTableSql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }}我们在使用的时候经常会犯一些错误:
/** * Created by lizhenya. */public class HomeActivity extends Activity { Button btn_home; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.layout_home); MyDBHelper().getInstances(this); }}单例模式的特点就是它的生命周期和Application一样,那么如果某个Activity实例被一个单例所持有,也就是说在单例里面引用了它,那么就会造成Activity对象无法正常回收释放。所以我们尽量的使用Application的全局Context。
3,属性动画导致的内存泄漏
从Android3.0开始,Google提供了属性动画,属性动画中有一类无限循环的动画,如果在Activity中播放此类动画并且在onDestroy()方法中没有停止该动画,那么动画会一直循环下去,尽管在界面上已经无法看不到动画了,但这个时候Activity的View会被动画持有,而View又持有Activity,最终Activity无法释放。下面的动画是无限循环的,会泄露当前的Activity。
/** * Created by lizhenya. */public class HomeActivity extends Activity { Button btn_home; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.layout_home); btn_home = (Button) findViewById(R.id.btn_home); ObjectAnimator animator = ObjectAnimator.ofFloat(btn_home, "ratation", 0, 360).setDuration(2000); animator.setRepeatCount(ValueAnimator.INFINITE); animator.start(); }}
解决方案:
在当前Activity的onDestroy()方法中取消动画:animator.cancel()。
/** * Created by lizhenya. */public class HomeActivity extends Activity { private Button btn_home; private ObjectAnimator animator; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.layout_home); btn_home = (Button) findViewById(R.id.btn_home); animator = ObjectAnimator.ofFloat(btn_home, "ratation", 0, 360).setDuration(2000); animator.setRepeatCount(ValueAnimator.INFINITE); animator.start(); } @Override protected void onDestroy() { super.onDestroy(); animator.cancel(); }}
0 0
- 内存泄漏优化---静态变量导致内存泄漏
- 内存——静态变量导致内存泄漏
- 静态方法会导致内存泄漏吗?
- Handler导致内存泄漏
- 内存泄漏优化---Handler引发内存泄漏
- 内存泄漏,检测,优化
- 性能优化(内存泄漏)
- 非静态内部类可能导致的内存泄漏及其优化
- 非静态内部类可能导致的内存泄漏及其优化
- 非静态内部类可能导致的内存泄漏及其优化
- 循环引用导致内存泄漏
- CATransition使用导致内存泄漏
- 导致内存泄漏的原因
- 循环引用导致内存泄漏
- 什么情况导致内存泄漏
- 单列模式导致内存泄漏
- ThreadLocal 导致的内存泄漏
- InputMethodManager导致的内存泄漏
- 第19课:Spark Streaming架构设计和运行机制大总结
- centos6.5搭建Nginx(Web Server)+Tomcat+MySql
- SQL Union和Union All使用方法
- Linux USB 驱动开发(四)—— 热插拔那点事
- Android 相关博客地址【更新中】
- 内存泄漏优化---静态变量导致内存泄漏
- 第20课:Spark Streaming中动态Batch Size实现初探
- Linux USB 驱动开发(五)—— USB驱动程序开发过程简单总结
- shutdown后tomcat进程无法关闭
- Android Dialog点击对话框外部让其消失的实现方法
- studio 代码混淆
- android高级控件之AutoCompleteTextView
- Linux USB 驱动开发实例(一) —— USB摄像头驱动实现源码分析
- Hadoop学习(一): Ubuntu上安装Hadoop