当前位置: 编程技术>移动开发
本页文章导读:
▪MTK 输出Trace信息到资料中 MTK 输出Trace信息到文件中
#include "FileMgrGProt.h"
void mmi_write_buffer_to_file(char *buff, unsigned int buffSize, char *fileName)
{
S32 ret = 0;
U32 rwLen = 0;
S8 ascii_path[32];
S8 ucs2_path[64];
FS_HANDLE fileHandle.........
▪ 好意的谎言: AdapterView、Adapter优化 善意的谎言: AdapterView、Adapter优化
我们觉得ListView卡卡的时候就会自然的去寻找优化大法,LZ也一样。一方面拼命优化view的结构一方面另外找到了这么一个广为流传的 ViewHolder、ViewCache办.........
▪ 老忘,标注上。备忘 老忘,标注下。。备忘
HVGA 320*480像素;QVGA 320*240像素;WQVGA400 400*240像素;WQVGA432 432*240像素;WVGA800 800*480像素;WVGA854 854*480像素
......
[1]MTK 输出Trace信息到资料中
来源: 互联网 发布时间: 2014-02-18
MTK 输出Trace信息到文件中
这样是输出fileName 到文件当中
这样是输出当前文件的行号到文件中
#include "FileMgrGProt.h" void mmi_write_buffer_to_file(char *buff, unsigned int buffSize, char *fileName) { S32 ret = 0; U32 rwLen = 0; S8 ascii_path[32]; S8 ucs2_path[64]; FS_HANDLE fileHandle; sprintf(ascii_path, "%c:\\%s", MMI_CARD_DRV, fileName); mmi_asc_to_ucs2(ucs2_path, ascii_path); ret = FS_GetAttributes((const WCHAR *)ucs2_path); if(ret < FS_NO_ERROR) { fileHandle = FS_Open((const WCHAR *)ucs2_path, FS_CREATE_ALWAYS|FS_READ_WRITE); } else { fileHandle = FS_Open((const WCHAR *)ucs2_path, FS_READ_WRITE); } kal_prompt_trace(MOD_TST, "mmi_write_buffer_to_file, fileHandle=%d", fileHandle); ASSERT(fileHandle>=FS_NO_ERROR); ret = FS_Seek(fileHandle, 0, FS_FILE_END); ret = FS_Write(fileHandle, buff, buffSize, &rwLen); FS_Close(fileHandle); ASSERT(rwLen==buffSize); ASSERT(ret >= FS_NO_ERROR); }
在使用的时候先定义一个buffer
例如:
char filebuff[64] = {0}; //大小可以根据需要来定 memset(filebuff, 0, 64); sprintf(filebuff, "error code\r\n"); mmi_write_buffer_to_file(filebuff, strlen(filebuff), "error.txt");
这样是输出error code 到文件当中
memset(filebuff, 0, 64); sprintf(filebuff, "fN=%s\r\n", fileName); mmi_write_buffer_to_file(filebuff, strlen(filebuff), "error.txt");
这样是输出fileName 到文件当中
memset(filebuff, 0, 64); sprintf(filebuff, "XXXXX.c, line %d\r\n", __LINE__); mmi_write_buffer_to_file(filebuff, strlen(filebuff), "error.txt");
这样是输出当前文件的行号到文件中
这样很方便使用,又不用担心catcher引起问题.
[2] 好意的谎言: AdapterView、Adapter优化
来源: 互联网 发布时间: 2014-02-18
善意的谎言: AdapterView、Adapter优化
我们觉得ListView卡卡的时候就会自然的去寻找优化大法,LZ也一样。一方面拼命优化view的结构一方面另外找到了这么一个广为流传的 ViewHolder、ViewCache办法:
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.topic_list, null);
holder.title = (TextView) convertView.findViewById(R.id.title);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
}
public class ViewHolder {
public TextView getTitle() {
if (title == null) {
title = (TextView) baseView.findViewById(R.id.title);
}
return title;
}
}
大概思想是setTag();getTag();来保存已经加载过了的 ViewHolder 组件,现在我称ViewHolder 为ABCD 意为毫无特殊意义的类,顶多用到了单例的思想
但是我觉得这些都是毫无意义的, 用tag来保存ViewHolder 这个属于耍小聪明的意思,曲解了tag的本意。另外整个代码并没有真正达到需要的要求
Listview的展现可以看成是分页,系统会加载第一页 我们从写getView 的时候convertView是null 可以看成是第一页的样式没有被初始化。
这个时候我们
holder = new ViewHolder(); convertView = inflater.inflate(R.layout.topic_list, null);
holder.title = (TextView) convertView.findViewById(R.id.title);
开始进行初始化的工作,”第二页“之后这些不必再进行,所以 我认为网上所说的优化指的就是减少“第一页”之后的View创建。这个确实是不错。
但是这种优化没有实质上的改进,有时候我在想为什么全部加载完毕listView回拉还会调用getView()把我的一些初始化代码再来一遍?这个显然是不合理的,而且
不仅仅是初始化问题,一个listView之所以卡主要原因在于来回的进行逻辑操作,例如:listView里面有imageview 而且里面的image是从网络上的,而且你没有存到本地
之类的处理,而且显示出来的时候还要根据width来控制整张图片的尺寸进行缩放,加载listview不可避免的需要做这些操作也就算了,如果已经加载过了这些数据
在来回拖拽的时候也要再操作一遍就会令人无法忍受!
怎么去优化?一方面,我们知道了第一页之后不必要再new 新的View出来,另外一方面我们知道了最重要的是View的内容部能来回、重复初始化。
个人觉得android里面应该有这样的“属性”或者“设置” 让每一项加载过之后不需要再加载直接使用”缓存“的数据。
但是我没有发现这种“设置”,于是我在Adapter 里面用一个HashMap<Integer, View> 储存对应的View
HashMap<Integer, View> m = new HashMap<Integer, View>();
public View getView(int position, View view, ViewGroup parent) {
View convertView = m.get(position);
if (convertView != null) {
return convertView;
} else {
convertView = inflater.inflate(R.layout.topic_list, null);
TextView title = (TextView) convertView
.findViewById(R.id.title);
m.put(position, convertView);
}
}
暂时就这样了,潜在的问题和其他优化没有细想,成果是 20行带较大的图片的listView来回拖拽毫无压力。
。。。有人告诉过你 我没有用异步操作?
。。。这是一种必然。。你这么问 就像既想适用Map保存又不想用map保存一样。
一个adapter 加载的时候不会有任何不一样,用map保存就是对付回拉的时候
至于200个map装不装的了 自己看着办吧
不太明白你说的指什么
能贴个例子 讲下效果?
每种处理都有自己的适用范围。 我已经表态了这样写对列表来回拖动的性能有重大提升。
我们觉得ListView卡卡的时候就会自然的去寻找优化大法,LZ也一样。一方面拼命优化view的结构一方面另外找到了这么一个广为流传的 ViewHolder、ViewCache办法:
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.topic_list, null);
holder.title = (TextView) convertView.findViewById(R.id.title);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
}
public class ViewHolder {
public TextView getTitle() {
if (title == null) {
title = (TextView) baseView.findViewById(R.id.title);
}
return title;
}
}
大概思想是setTag();getTag();来保存已经加载过了的 ViewHolder 组件,现在我称ViewHolder 为ABCD 意为毫无特殊意义的类,顶多用到了单例的思想
但是我觉得这些都是毫无意义的, 用tag来保存ViewHolder 这个属于耍小聪明的意思,曲解了tag的本意。另外整个代码并没有真正达到需要的要求
Listview的展现可以看成是分页,系统会加载第一页 我们从写getView 的时候convertView是null 可以看成是第一页的样式没有被初始化。
这个时候我们
holder = new ViewHolder(); convertView = inflater.inflate(R.layout.topic_list, null);
holder.title = (TextView) convertView.findViewById(R.id.title);
开始进行初始化的工作,”第二页“之后这些不必再进行,所以 我认为网上所说的优化指的就是减少“第一页”之后的View创建。这个确实是不错。
但是这种优化没有实质上的改进,有时候我在想为什么全部加载完毕listView回拉还会调用getView()把我的一些初始化代码再来一遍?这个显然是不合理的,而且
不仅仅是初始化问题,一个listView之所以卡主要原因在于来回的进行逻辑操作,例如:listView里面有imageview 而且里面的image是从网络上的,而且你没有存到本地
之类的处理,而且显示出来的时候还要根据width来控制整张图片的尺寸进行缩放,加载listview不可避免的需要做这些操作也就算了,如果已经加载过了这些数据
在来回拖拽的时候也要再操作一遍就会令人无法忍受!
怎么去优化?一方面,我们知道了第一页之后不必要再new 新的View出来,另外一方面我们知道了最重要的是View的内容部能来回、重复初始化。
个人觉得android里面应该有这样的“属性”或者“设置” 让每一项加载过之后不需要再加载直接使用”缓存“的数据。
但是我没有发现这种“设置”,于是我在Adapter 里面用一个HashMap<Integer, View> 储存对应的View
HashMap<Integer, View> m = new HashMap<Integer, View>();
public View getView(int position, View view, ViewGroup parent) {
View convertView = m.get(position);
if (convertView != null) {
return convertView;
} else {
convertView = inflater.inflate(R.layout.topic_list, null);
TextView title = (TextView) convertView
.findViewById(R.id.title);
m.put(position, convertView);
}
}
暂时就这样了,潜在的问题和其他优化没有细想,成果是 20行带较大的图片的listView来回拖拽毫无压力。
2 楼
over140
2011-01-06
我也有同感,不过最好需要测试数据比较好一点,因为那个来说GOOGLE IO的优化方法里面有测试数据。
实际上setTag会增加系统的开销,还要多一个静态内部类,即使是优化也是空间换时间的做法,应该有个权衡。
实际上setTag会增加系统的开销,还要多一个静态内部类,即使是优化也是空间换时间的做法,应该有个权衡。
3 楼
ak121077313
2011-01-07
<p>我只能说,业务类越复杂 效果越明显。</p>
4 楼
boygirl
2011-01-07
还是分层比较好,可能用习惯J2EE开发模式吧
5 楼
myth2loki
2011-01-07
把费事的操作放到异步里不是更好吗?比如图片加载,网络数据读取什么的?
6 楼
ak121077313
2011-01-07
myth2loki 写道
把费事的操作放到异步里不是更好吗?比如图片加载,网络数据读取什么的?
。。。有人告诉过你 我没有用异步操作?
7 楼
ak121077313
2011-01-07
核心提示,listView的item都加载完毕往回拉是否停顿,如果有停顿说明没有写好。
因为加载过了的不需要再加载,除了特别业务处理
因为加载过了的不需要再加载,除了特别业务处理
8 楼
常思己过
2011-01-07
有个问题请教楼主,如果数据很多HashMap里是不是会越来越大呢,假设有200个item,HashMap就要存200个View,如果更多呢
9 楼
ak121077313
2011-01-07
常思己过 写道
有个问题请教楼主,如果数据很多HashMap里是不是会越来越大呢,假设有200个item,HashMap就要存200个View,如果更多呢
。。。这是一种必然。。你这么问 就像既想适用Map保存又不想用map保存一样。
一个adapter 加载的时候不会有任何不一样,用map保存就是对付回拉的时候
至于200个map装不装的了 自己看着办吧
10 楼
zhuixinjian
2011-01-09
public View getView(int position, View view, ViewGroup parent)
这个view你不能直接用???????
这个view你不能直接用???????
11 楼
ak121077313
2011-01-10
zhuixinjian 写道
public View getView(int position, View view, ViewGroup parent)
这个view你不能直接用???????
这个view你不能直接用???????
不太明白你说的指什么
能贴个例子 讲下效果?
12 楼
stevevai
2011-01-18
这样的做法对付静态的List还可以,如果是微博这样的应用,不停需要往List里面插入数据,就会出现问题了。
13 楼
ak121077313
2011-01-19
stevevai 写道
这样的做法对付静态的List还可以,如果是微博这样的应用,不停需要往List里面插入数据,就会出现问题了。
每种处理都有自己的适用范围。 我已经表态了这样写对列表来回拖动的性能有重大提升。
14 楼
lyltiger
2011-01-21
嗯 学习了~
15 楼
xiebaolong
2011-03-28
我判断那个东西convertView 也是用异步去做的,却不知道怎么回事出现很诡异的问题,图片总是变来变去的,能让getView不重复调用吗?
16 楼
wuhoufeng
2011-03-29
这段代码里面创建ViewHolder是有问题的,在google IO上的本意是利用ViewHolder静态类的特性,避免创建对象影响性能,不知道哪个人改了这段代码。
17 楼
1986zzrobin
2011-04-01
个人感觉为什么getView 被调用了多次。是因为list在快速挂滑动时,有选择的进行了。失针操作。不知道我这么形容对不对。就是在快速滑动时 ondraw()并没有调用。
好像appdome里有个很大的listview。是性能优化方面的例子。可以参考下。
我继续找我的问题了。。。就是在textview用。获得某些字的坐标 Y 值
好像appdome里有个很大的listview。是性能优化方面的例子。可以参考下。
我继续找我的问题了。。。就是在textview用。获得某些字的坐标 Y 值
18 楼
woaidousha
2011-04-02
这么意外,跟楼主用的是一样的方法。。。不过虚拟机都很卡,感觉不到有没有提升
19 楼
joe_zhpf
2011-04-13
public class ViewHolder {
public TextView getTitle() {
if (title == null) {
title = (TextView) baseView.findViewById(R.id.title);
}
return title;
}
}
声明下:这里可能会违背 封装等规则,但是可以换来一些性能的提升,所以不建议去增加getter,setter.
google 上面的 关于holder的建议是:
public class ViewHolder {
TextView tv;
}
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.topic_list, null);
holder.title = (TextView) convertView.findViewById(R.id.title);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.title.setText("xxxx");
}
根据goole的说明,主要是考虑到优化两个东西,一个是 减少inflate()执行的次数,实际就是减少new View的次数,建对象的次数.(因为view,对象复杂得多,比起holder来)
一个就是, 尽量少使用findViewById(). 至于这个函数执行开销,没有深究过,不知道里面具体是怎么实现的.只是 因为 google的建议....
public TextView getTitle() {
if (title == null) {
title = (TextView) baseView.findViewById(R.id.title);
}
return title;
}
}
声明下:这里可能会违背 封装等规则,但是可以换来一些性能的提升,所以不建议去增加getter,setter.
google 上面的 关于holder的建议是:
public class ViewHolder {
TextView tv;
}
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.topic_list, null);
holder.title = (TextView) convertView.findViewById(R.id.title);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.title.setText("xxxx");
}
根据goole的说明,主要是考虑到优化两个东西,一个是 减少inflate()执行的次数,实际就是减少new View的次数,建对象的次数.(因为view,对象复杂得多,比起holder来)
一个就是, 尽量少使用findViewById(). 至于这个函数执行开销,没有深究过,不知道里面具体是怎么实现的.只是 因为 google的建议....
20 楼
dzzhu
2011-04-18
你这种做法当然可以,用空间换时间的典型案例,在ListView中View个数确定且不大的情况下没问题。
Android标准的ListView和Adapter设计时,是考虑要重用Scroll出可视区域的View的,比如一个ListView中有1000项,可视区域只能显示20项时,按照Framework设计者的思路,是只需要inflate 20个View的,ListView中会把Scroll出可视区域的View放入RecycleBin,然后从RecycleBin中取出一个View作为convertView参数传给你。
iOS也是如此设计的。
当然现在的设备动辄500MB内存,其实你爱怎么做也没人管你。
Android标准的ListView和Adapter设计时,是考虑要重用Scroll出可视区域的View的,比如一个ListView中有1000项,可视区域只能显示20项时,按照Framework设计者的思路,是只需要inflate 20个View的,ListView中会把Scroll出可视区域的View放入RecycleBin,然后从RecycleBin中取出一个View作为convertView参数传给你。
iOS也是如此设计的。
当然现在的设备动辄500MB内存,其实你爱怎么做也没人管你。
21 楼
summertse
2011-05-27
你数据量小,想怎么搞就怎么搞吧,至少在数据量小的情况下,效果差不多
至少在我们项目中,原本使用的是楼主的这个方式,确实存在问题(内存问题)。然后换成android的推荐方式了。
BTW, android貌似对每个应用可用的堆内存做了限制,所以内存并不根据机器内存增大而增大。
至少在我们项目中,原本使用的是楼主的这个方式,确实存在问题(内存问题)。然后换成android的推荐方式了。
BTW, android貌似对每个应用可用的堆内存做了限制,所以内存并不根据机器内存增大而增大。
[3] 老忘,标注上。备忘
来源: 互联网 发布时间: 2014-02-18
老忘,标注下。。备忘
HVGA 320*480像素;QVGA 320*240像素;WQVGA400 400*240像素;WQVGA432 432*240像素;WVGA800 800*480像素;WVGA854 854*480像素
最新技术文章: