一个Activity大致是这样的结构,当界面发生变化的时候(比如动画,点击,滚动条滚动,界面刷新)都需要一层层的重绘界面,最终将所有VISIBLE显示的VIEW全部重绘为止,也就是说,当滚动条从滚动的时候,会调用N次VIEW的onMeasure, dispatchDraw,onDraw方法,其中如果当前VIEW有背景的情况下,那么会调用onDraw和dispatchDraw方法,如果没有背景,那么只调用dispatchDraw方法。
所以,想要提高UI的性能,首先需要做的事情,就是减少不必要的onMeasure,dispatchDraw,onDraw调用。
打个比方,当通过调用View的layout方法来实现VIEW在界面上覆盖时,尽量将被遮住的VIEW隐藏起来,特别是一些绘制起来比较大的VIEW,如ListView,GridView等。
下面再谈谈ListView和GridView的性能优化
1、关于Google IO大会关于Adapter的优化,参考以下文章:
Android开发之ListView 适配器(Adapter)优化
Android开发——09Google I/O之让Android UI性能更高效(1)
2、在这里我要说的是另一种方法
ArrayList<String> List;
Context ctx;
public BookAdapter(Context c,ArrayList<String> list){
List = list;
ctx = c;
BuildViewList();
}
View[] viewList;
private void BuildViewList()
{
viewList = new View[List.size()];
}
@Override
public int getCount() {
return List.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View layout = viewList[position];
//如果该View没有初始化,那么初始化它,并且放入缓存数组
if (layout == null)
{
final LayoutInflater inflater = LayoutInflater.from(ctx);
// 给ImageView设置资源
layout = (LinearLayout)inflater.inflate(R.layout.listitem, null);
TextView txtName = (TextView)layout.findViewById(R.id.txtBookName);
txtName.setText(List.get(position))
viewList[position] = layout;
}
return layout;
}
}