今天看了下文档,说TraceView 对程序的的性能和优化有很大的帮助:
本人比较懒,文章也没继续往下下看,直接百度了下TraceView 的使用技巧,资源很多,介绍怎么使用
推荐:http://blog.csdn.net/itachi85/article/details/6857324
当然具体怎么做的步骤简单的一下,大概分这么几步:
一:在创建avd ,给sd卡的内存大一点,因为后面的debug.raceView 生成的文件可能比较的大。
二:写一个测试的程序:
- Debug.startMethodTracing();
有开始当然必须有结束,如果不掉用Debug.stopMethodTracing(); 在sd卡的根目录上则不会出现dmtrace.trace 文件
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
- note:建议在onPuse()方法中调用Debug.stopMethodTracing ,不建议在ondestory() 或者onstop()方法中调用,因为有可能程序在莫名的情况下不一定会走ondestory,和onstop ,所以在onpuse中比较的靠谱
三: 运行前不要着急:记得给sd卡加权限 否则会抛权限异常的:
四: 生成了dmtrace.trace文件当然需要看了啊! 怎么看,google人性化,在android 开发工具中的 tools 中有个TraceView 工具只你只要
cmd 到该目录下,然后再把sd卡上的dmtrace.trace 文件导入到pc 的 某个路劲 (默认是的:c\dmtrace.trace)
然后执行:traceview C:\dmtrace.trace (自己的路劲哦)
物: 然后你就看打如下界面:
看到界面是不是晕了啊!:
这个咋看啊 ! 刚开始进来我也不知道看啥,也不知道怎么看,不懂百度:
原来:
- 在traceview的右半部统计字段中:
- Exclusive: 同级函数本身运行的时间Inclusive 就是说除统计函数本身运行的时间外再加上调用子函数所运行的时间
- Name:列出的是所有的调用项,前面的数字是编号,展开可以看到有的有Parent 和Children子项,就是指被调用和调用。
- Incl: inclusive时间占总时间的白分比
- Excl: 执行占总时间的白分比。
- Calls+Recur Calls/Total: 调用和重复调用的次数
- Time/Call: 总的时间。(ms)
- 是不是明白了些
本人还有个使用的心得,跟大家分享下: 就是你看到下面的数据这么多,又不知道看什么好时,最底下是不是有一个过滤栏,如果没有他你眼睛都会被晃瞎啊,因为数据太多了
好上面是简单的 TraceView 使用:
下面咋门用他来验证下,是不是有这么的神奇啊 !
不验证其他的就用他来验证我的Listview性能 ,这个问题很纠结我很长的一段时间了,因为listview优化网上给出了很多不同的版本和意见:
关于listView 优化的: http://www.cnblogs.com/over140/archive/2011/03/23/1991100.html
- package com.liao.listadpter;
- import java.util.ArrayList;
- import java.util.List;
- import android.app.ListActivity;
- import android.os.Bundle;
- import android.os.Debug;
- public class MainActivity extends ListActivity {
- private List<String> data;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- //setContentView(R.layout.main);
- Debug.startMethodTracing();
- initData();
- initadapter();
- }
- public void initData() {
- data = new ArrayList<String>();
- for (int i = 0; i < 1000; i++) {
- data.add("test: " + i);
- }
- }
- public void initadapter() {
- TestAdapter testAdapter = new TestAdapter(data, MainActivity.this);
- this.setListAdapter(testAdapter);
- }
- @Override
- protected void onPause() {
- // TODO Auto-generated method stub
- super.onPause();
- Debug.stopMethodTracing();
- }
- }
adapter 信息
- package com.liao.listadpter;
- import java.util.List;
- import org.w3c.dom.Text;
- import android.content.Context;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.ImageView;
- import android.widget.LinearLayout;
- import android.widget.TextView;
- public class TestAdapter extends BaseAdapter{
- private List<String> listData;
- private Context context;
- private LayoutInflater inflater;
- private LinearLayout layout;
- TestAdapter(List<String> listData ,Context context){
- this.listData =listData;
- this.context =context;
- inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
- }
- public int getCount() {
- // TODO Auto-generated method stub
- return listData.size();
- }
- public Object getItem(int position) {
- // TODO Auto-generated method stub
- return listData.get(position);
- }
- public long getItemId(int position) {
- // TODO Auto-generated method stub
- return position;
- }
- public View getView(int position, View convertView, ViewGroup parent) {
- // TODO Auto-generated method stub
- if(convertView ==null){
- layout = (LinearLayout) inflater.inflate(R.layout.listview, null);
- }
- else{
- layout = (LinearLayout) convertView;
- }
- int id= position %2==1? R.drawable.icon: R.drawable.default_head;
- ((ImageView) layout.findViewById(R.id.iamge)).setImageResource(id);
- ((TextView) layout.findViewById(R.id.text)).setText(listData.get(position));;
- // TextView text = (TextView) layout.findViewById(R.id.text);
- // ImageView view= (ImageView) layout.findViewById(R.id.iamge);
- //
- // text.setText(listData.get(position));
- return layout;
- }
- static class ViewHoder{
- public TextView text;
- public ImageView view;
- }
- }
下面是xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation ="horizontal"
- >
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="list 1"
- android:id ="@+id/text"
- android:layout_gravity = "center_vertical"
- />
- <ImageView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:id ="@+id/iamge"
- android:src ="@drawable/icon"
- />
- </LinearLayout>
效果图:
好现在咋门来验证listView 的神奇,listview主要需要优化的就是getView() 这个方法,实现其中convertView 的缓存优化,下面就利用TraceView 测试下listview重用convertView 的区别:
首先啥都不做:
- public View getView(int position, View convertView, ViewGroup parent) {
- // TODO Auto-generated method stub
- LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.listview, null);
- TextView text = (TextView) layout.findViewById(R.id.text);
- ImageView view= (ImageView) layout.findViewById(R.id.iamge);
- text.setText(listData.get(position));
- int id= position %2==1? R.drawable.icon: R.drawable.default_head;
- view.setImageResource(id);
- return layout;
- }
运行程序,然后随意的拖动listview 列表,然后安菜单键退出程序: 去ddms 中fileExplorer中 点击sd卡 你会早根目录上看到dmtrace.trace 文件
把dmtrace.trace 导出到C盘 ,命令行键入android tools 文件夹下 执行 traceview C:\ dmtrace.trace 出现了traceview 视图
因为咋门看到的是getview优化操作:所以直接在Find: 键入getView 他则会找到我们写的程序的方法:
看到没有:未进行优化的情况下:getView占用资源是 35.2% 其中布局填充(inflate)占其中的89.7% 整个程序中inflated 就占33%,getView()方法就是全被布局填充耗费了这么多的资源, 看不下去了
优化一
直接加两行代码:
- if(convertView ==null){
- layout = (LinearLayout) inflater.inflate(R.layout.listview, null);
- }else{
- layout =(LinearLayout) convertView;
- }
在运行 ,在查看getview:
看到没有,看到没有:9.4% 占整个程序的9.4% ,并且 inflated 在getview中只耗费了41.7%了,一半多的节省啊!
两行的代码就带来这么大的效率提高: 难道你没觉察到! 神奇
优化二
下面是网上盛传的:ViewHolder 优化测试 通过setTAG
- public View getView(int position, View convertView, ViewGroup parent) {
- // TODO Auto-generated method stub
- // LinearLayout layout;
- // if(convertView ==null){
- // layout = (LinearLayout) inflater.inflate(R.layout.listview, null);
- // }else{
- // layout =(LinearLayout) convertView;
- // }
- //
- // TextView text = (TextView) layout.findViewById(R.id.text);
- // ImageView view= (ImageView) layout.findViewById(R.id.iamge);
- //
- // text.setText(listData.get(position));
- // int id= position %2==1? R.drawable.icon: R.drawable.default_head;
- // view.setImageResource(id);
- ViewHolder holder;
- if (convertView == null) {
- convertView = inflater.inflate(R.layout.listview,
- null);
- holder = new ViewHolder();
- holder.view = (ImageView) convertView.findViewById(R.id.iamge);
- holder.text = (TextView) convertView.findViewById(R.id.text);
- convertView.setTag(holder);
- }
- else{
- holder = (ViewHolder)convertView.getTag();
- }
- int id= position %2==1? R.drawable.icon: R.drawable.default_head;
- holder.view.setImageResource(id);
- holder.text.setText(listData.get(position));
- return convertView;
- }
- static class ViewHolder {
- TextView text;
- ImageView view;
- }
测试效果是比 优化一 好点点: 主要在于findviewbyID 比findviewbyTag少了很多
优化三
- if (convertView == null) {
- convertView = inflater.inflate(R.layout.listview, null);
- convertView.setTag(R.id.text, convertView.findViewById(R.id.text));
- convertView.setTag(R.id.iamge, convertView.findViewById(R.id.iamge));
- }
- ((TextView) convertView.getTag(R.id.text)).setText(listData.get(position));
- int id= position %2==1? R.drawable.icon: R.drawable.default_head;
- ((ImageView) convertView.getTag(R.id.iamge)).setImageResource(id);
大家也看到了。跟优化一是差不多的最终的效果
也许结果不是很准确,但至少我们知道了怎么使用traceView 来帮助我们,同时也知道了listview一定的优化,具体采用哪种优化还需要看具体的需求,
对于性能要求很高的 推荐,优化二,对于一般的应用优化一足够了,再有就是settag 和findbyid 使用情况,经过测试证明了:
View本身因为setTag而会占用更多的内存,还会增加代码量;而findViewById会临时消耗更多的内存,所以不可盲目使用,依实际情况而定。
转载出处: http://blog.csdn.net/liao3841054/article/details/7162181