1. 代码优化的关键有一下几点:
- 少用浮点运算、文件、pipe、数据库访问
- 用高效的方式:StringBuffer代替大量临时String,SoundPool代替多个MediaPlayer,texture代替canvas, Log.d() 代替System.out.print(),避免invalidate()
- 重视onMeasure/onLayout/onDraw/onTouchEvent/getView等函数的效率
2. 游戏开发需要注意一下几点:
- 少用new()/enum/Iterator/HashMap/Arrays.sort()/Class.getXXX()…
- 多用private、final、局部变量,
- 2D善用draw_texture、3D善用VBO顶点缓冲
- 触屏事件时,暂停接受运动感应事件
- 用NDK实现关键代码
3. 不要求速度时,可用WebView和网页实现界面
4. 编译时执行代码优化Android开发过程中如何进行算法与界面的优化?
1. 调整程序的进程结构
- 减少进程数量(善用ViewStub、ViewSwitch等)
- 减少进程周期循环次数,及时让进程休眠
- 不编写长寿代码,只在需要时运行,服务应快速完成并立即结束
2. 调整算法,取消不必要的环节,减少对CPU和内存的需求
- 减少函数调用次数
- 适当使用JNI
3. 精心设计界面
- 避免复杂布局。控制嵌套和View数量,善用Merge、inflate()、RelativeLayout等
- 去除不必要的背景、动画
- 执行长时间、耗电的任务之前检查电量、提示用户
Activity结束后进程仍然存在,开发者不需要编写结束进程的代码,系统自动判断何时该终止。 当然也可以主动结束本Activity: 正常方式(进程未必会结束) finish(); 传统方式(真正结束进程): System.exit(0); 自杀方式(真正结束进程): android.os.Process.killProcess( android.os.Process.myPid());
Adapter的作用是界面与数据之间的桥梁,通过设置适配器至ListView控件后(如调用ListView的 setAdapter(ListAdapter adapter) ),列表的每一项会显示至页面中。其实,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View,如:
@Overridepublic View getView(int position, View convertView, ViewGroup parent) {return super.getView(position, convertView, parent);}
我们看一看下面的这段代码:public View getView(int position, View convertView, ViewGroup parent) {View newView = mInflater.inflate(R.layout.list_item, null);((TextView) newView .findViewById(R.id.text)).setText(DATA[position]);((ImageView) newView .findViewById(R.id.icon)).setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);return newView ;}
上面的代码块中,我通过LayoutInflater.inflate(,)将Layout文件–layout.list_item转换为View.
(注:Layout也是View的子类,但在android中如果想将xml中的Layout转换为View放入.java代码中操作,只能通过Inflater,而不能通过findViewById())
这时,如果我的ITEM项有数以千条这样多或更多呢,再以上面代码块的写法,后果自己想想吧。于是,改用其它一种写法:
public View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = mInflater.inflate(R.layout.list_item, null);}((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]);((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);return convertView;}
这时,上面的代码是不是好了很多?系统将会减少创建很多View。性能得到了很大的提升。
到这里,问一下,还有没有优化的方法呢,是有的,请看————》》:public View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {convertView = mInflater.inflate(R.layout.list_item_icon_text, null);holder = new ViewHolder();holder.text = (TextView) convertView.findViewById(R.id.text);holder.icon = (ImageView) convertView.findViewById(R.id.icon);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}holder.text.setText(DATA[position]);holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);return convertView;}static class ViewHolder {TextView text;ImageView icon;}
这样系统性能会得到更大的提升。
希望可能帮助到大家。这也是平时面试当中面试官经常会问到的”ListView的优化”的问题。