举一些简单例子说明如何把程序写得更健壮
1) 定义字符串应该尽量使用 String str="hello";
2) 如果要对字符串频繁的相加,且每次相加都会成新的字符串对象,这样会很影响性能。要用StringBuffer代替字符串相加
2、将成员缓存到本地
1)永远不要在for的第二个条件中调用任何方法。如下面方法所示,在每次循环的时候都会调用getCount()方法,这样做比你在一个int先把结果保存起来开销大很多。
for(int i =0; i < this.getCount(); i++) {
dumpItems(this.getItem(i));
}
2)访问成员变量比访问本地变量慢得多,下面一段代码:
for(int i =0; i <this.mCount; i++) {
dumpItem(this.mItems);
}
最好改成这样:
int count = this.mCount;
Item[] items = this.mItems;
for(int i =0; i < count; i++)
{
dumpItems(items);
}
3)使用for-each循环具有更高的效率
3、合理使用static
减少不必要的全局变量,尽量避免static成员变量引用资源耗费过多的实例
4、合理使用强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)和虚引用(PhantomReference)。
5、 复杂算法尽量用C完成
6、 缓存
适量使用缓存,不要过量使用,如HashMap缓存一些数据不宜一次缓存太多,可以使用一些缓存算法,如FIFO。
6、 防止内存溢出及内存泄漏
7、简单举例:针对ListView的性能优化
i. 复用convertView。
ii. 在getItemView中,判断convertView是否为空,如果不为空,可复用。如果couvertview中的view需要添加 listerner,代码一定要在if(convertView==null){}之外。
iii. 异步加载图片,item中如果包含有web image,那么最好异步加载。
iv. 快速滑动时不显示图片
当快速滑动列表时(SCROLL_STATE_FLING),item中的图片或获取需要消耗资源的view,可以不显示出 来;而处于其他两种状 态(SCROLL_STATE_IDLE 和SCROLL_STATE_TOUCH_SCROLL),则将那些view显示出来。
v. item尽可能的减少使用的控件和布局的层次;背景色与cacheColorHint设置相同颜色;ListView中item的布局至关重要,必须尽可 能的减少使用的控件,布局。 RelativeLayout是绝对的利器,通过它可以减少布局的层次。同时要尽可能的复用控件, 这样可以减少 ListView的内存使用,减少滑动时gc次数。ListView的背景色与cacheColorHint设置相同颜色,可以提高滑动时的渲染性能。
vi. getView优化
ListView中getView是性能是关键,这里要尽可能的优化。getView方法中要重用view;getView方法中不能做复杂的逻辑计算,特别是数据库和网络访问操作,否则会严重影响滑动时的性能。优化如下所示:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.d("MyAdapter", "Position:" + position + "---" + String.valueOf(System.currentTimeMillis()));
final LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.list_item_icon_text, null);
((ImageView) v.findViewById(R.id.icon)).setImageResource(R.drawable.icon);
((TextView) v.findViewById(R.id.text)).setText(mData[position]);
return v;
}
建议改为:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.d("Adapter", "Position:" + position + " : " + String.valueOf(System.currentTimeMillis()));
ViewHolder holder;
if (convertView == null) {
final LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_item_icon_text, null);
holder = new ViewHolder();
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
holder.text = (TextView) convertView.findViewById(R.id.text);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.icon.setImageResource(R.drawable.icon);
holder.text.setText(mData[position]);
return convertView;
}
static class ViewHolder {
ImageView icon;
TextView text;
}
}