1、前言html
前幾天發現09年Google IO大會關於移動應用方面的主題有一些不錯的PPT,對移動應用開發頗有幫助。本身看了一些,邊看邊和你們分享。既然是PPT就很簡化了,我會根據實際狀況寫一些Demo供你們參考。app
Android在UI優化方面能夠從如下五個方面入手:ide
Adapter優化佈局
背景和圖片優化測試
繪圖優化優化
視圖和佈局優化spa
內存分配優化code
2、Adapter優化移動應用開發
什麼是Adapter,能夠先看看個人上一篇文章,Android開發——說說Adapter那點事 Adapter與View的鏈接主要依靠getView這個方法返回咱們須要的自定義view。ListView是Android app中一個最最最經常使用的控件了,因此如何讓ListView流暢運行,獲取良好的用戶體驗是很是重要的。對ListView優化就是對Adapter中的getView方法進行優化。09年的Google IO大會給出的優化建議以下:htm
Adapter優化示例代碼:
1: @Override
2: public View getView(int position, View convertView, ViewGroup parent) {
3: Log.d("MyAdapter", "Position:" + position + "---"
4: + String.valueOf(System.currentTimeMillis()));
5: ViewHolder holder;
6: if (convertView == null) {
7: final LayoutInflater inflater = (LayoutInflater) mContext
8: .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
9: convertView = inflater.inflate(R.layout.list_item_icon_text, null);
10: holder = new ViewHolder();
11: holder.icon = (ImageView) convertView.findViewById(R.id.icon);
12: holder.text = (TextView) convertView.findViewById(R.id.text);
13: convertView.setTag(holder);
14: } else {
15: holder = (ViewHolder) convertView.getTag();
16: }
17: holder.icon.setImageResource(R.drawable.icon);
18: holder.text.setText(mData[position]);
19: return convertView;
20: }
21:
22: static class ViewHolder {
23: ImageView icon;
24:
25: TextView text;
26: }
以上是Google io大會上給出的優化建議,通過嘗試ListView確實流暢了許多。
1: @Override
2: public View getView(int position, View convertView, ViewGroup parent) {
3: Log.d("MyAdapter", "Position:" + position + "---"
4: + String.valueOf(System.currentTimeMillis()));
5: final LayoutInflater inflater = (LayoutInflater) mContext
6: .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
7: View v = inflater.inflate(R.layout.list_item_icon_text, null);
8: ((ImageView) v.findViewById(R.id.icon)).setImageResource(R.drawable.icon);
9: ((TextView) v.findViewById(R.id.text)).setText(mData[position]);
10: return v;
11: }
以上是不建議的作法!!
不過咱們仍是要懷疑一下,SO,咱們仍是來測試對比一下。
測試說明:
你們能夠看到在getView的時候咱們經過log打印出position和當前系統時間。咱們經過初始化1000條數據到Adapter顯示到ListView,而後滾動到底部,計算出position=0和position=999時的時間間隔。
測試機子:HTC Magic
測試實錄:打開測序,讓ListView一直滾動底部。:-)
測試結果:
兩種狀況在操做過程當中體驗明顯不一樣,在優化的狀況下流暢不少不少!
一、優化建議測試結果:
12-05 10:44:46.039: DEBUG/MyAdapter(13929): Position:0---1291517086043
12-05 10:44:46.069: DEBUG/MyAdapter(13929): Position:1---1291517086072
12-05 10:44:46.079: DEBUG/MyAdapter(13929): Position:2---1291517086085
……
12-05 10:45:04.109: DEBUG/MyAdapter(13929): Position:997---1291517104112
12-05 10:45:04.129: DEBUG/MyAdapter(13929): Position:998---1291517104135
12-05 10:45:04.149: DEBUG/MyAdapter(13929): Position:999---1291517104154
耗時:17967
二、沒優化的測試結果
12-05 10:51:42.569: DEBUG/MyAdapter(14131): Position:0---1291517502573
12-05 10:51:42.589: DEBUG/MyAdapter(14131): Position:1---1291517502590
12-05 10:51:42.609: DEBUG/MyAdapter(14131): Position:2---1291517502617
……
12-05 10:52:07.079: DEBUG/MyAdapter(14131): Position:998---1291517527082
12-05 10:52:07.099: DEBUG/MyAdapter(14131): Position:999---1291517527108
耗時:24535