1、静态变量引起内存泄露
静态变量从声明到程序退出才被销毁!
案例:
安卓activity的初始化了一个静态变量,当安卓横屏或者其他的导致activity重新加载,之前的静态变量实例化引用的是第一次创建的activity,导致他不能被回收!!!
解决:
当不需要某对象时,务必及时把它的引用从集合中清理掉。
2、使用Application的Context(生命周期)
前提:
Application Context的生命周期和应用的生命周期一样长,而不是取决于某个Activity的生命周期;
分析:
如果想保持一个长期生命的对象,并且这个对象需要一个Context,就可以使用Application对象。
可以通过调用Context.getApplicationContext()方法或者Activity.getApplication()方法来获得Application对象。
案例:
private static Resources mResources;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
if (mResources == null) {
//---------(1):小结1的问题:第一次创建的activity未被回收
// mResources = this.getResources();
///////=-------(2):Resources对象拥有的是Application对象的引用,若是创新创建activity,第一个被回收!
mResources = this.getApplication().getResources();
}
}
3、及时关闭资源(cursor/file/Bitmap)
前提:
创建该资源后,若是让系统回收,效率低,所以要控制回收!
解决的代码:
Cursor cursor = null;
try{
cursor = mContext.getContentResolver().query(uri,null,null,null,null);
if (cursor != null) {
cursor.moveToFirst();
// 处理数据
}
} catch (Exception e){
e.printStatckTrace();
} finally {
//判断是否为空,否则回收
if (cursor != null){
cursor.close();
}
}
Bitmap创建后,在没有使用后要及时调用recycle()释放内存!!!
4、对Adapter进行优化
背景:当listview的item条码多时,需要优化:
代码(适配器为每个item返回一个view):
//convertView是被缓存起来的List条目中的View对象
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.text);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText("line" + position);
return convertView;
}
private class ViewHolder {
TextView text;
}
分析:
当ListView滑动的时候,getView可能会直接返回旧的convertView。这里使用了convertView和ViewHolder,可以充分利用缓存,避免反复创建View对象和TextView对象。
5、java代码的微优化:
(1)创建新的对象都需要额外的内存空间,要尽量减少创建新的对象。
(2)将类、变量、方法等等的可见性修改为最小。
(3)针对字符串的拼接,使用StringBuffer替代String。
(4)不要在循环当中声明临时变量,不要在循环中捕获异常。
for(int i : a)
( 5 ) 如果对于线程安全没有要求,尽量使用线程不安全的集合对象。
( 6 ) 使用集合对象,如果事先知道其大小,则可以在构造方法中设置初始大小。
( 7 ) 文件读取操作需要使用缓存类,及时关闭文件。
( 8 ) 慎用异常,使用异常会导致性能降低。
( 9 ) 如果程序会频繁创建线程,则可以考虑使用线程池。
其他: