编程习惯——如何把程序写得更健壮

举一些简单例子说明如何把程序写得更健壮


1、避免创建不必要的对象
    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;
       }
}






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值