提高android应用的效率--主要讲解listview的优化

简介:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
Adapter是listview和数据源间的中间人。
 
当每条数据进入可见区域时,adapter的getview()会被调用,返回代表具体数据的视图。触摸滚动时,频繁调用。支持成百上千条数据。
 
下面为显示每条数据的xml文件:
 
<LinearLayout
xmlns:android= "http://schemas.android.com/apk/res/android"
android:orientation= "horizontal" >
<ImageView android:id= "@+id/icon"
android:layout_width= "48dip"
android:layout_height= "48dip"  />
<TextView android:id= "@+id/text"
android:layout_gravity= "center_vertical"
android:layout_width= "0dip"
android:layout_weight= "1.0"
android:layout_height= "wrap_content"  />
</LinearLayout>
 
1 。最简单的方法,最慢且最不实用
 
public  View getView( int  pos, View convertView,
ViewGroup parent){
View item = mInflater.inflate(R.layout.list_item,  null );
((TextView) item.findViewById(R.id.text)).
setText(DATA[pos]);
((ImageView) item.findViewButId(R.id.icon)).
setImageBitmap((pos &  1 ) ==  1  ? mIcon1 : mIcon2);
return  item;
}
 
2 。利用convertview回收视图,效率提高 200 %。
 
public  View getView( int  pos, View convertView,
ViewGroup parent){
if  (convertView ==  null ) {
convertView = mInflater.inflate(
R.layout.list_item,  null );
}
((TextView) convertView.findViewById(R.id.text)).
setText(DATA[pos]);
((ImageView) convertView.findViewButId(R.id.icon)).
setImageBitmap((pos &  1 ) ==  1  ? mIcon1 : mIcon2);
return  convertView;
}
 
3 。利用viewholder模式,效率在提高 50 %
 
static  class  ViewHolder {
TextView text;
ImageView icon;
}
 
  
 
public  View getView( int  pos, View convertView, ViewGroup parent){
ViewHolder holder;
if  (convertView ==  null ) {
convertView = mInflater.inflate(R.layout.list_item,  null );
holder =  new  ViewHolder();
holder.text = (TextView) convertView.findViewById(
R.id.text));
holder.icon = (ImageView) convertView.findViewButId(
R.id.icon));
convertView.setTag(holder);
else  {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(DATA[pos]);
holder.icon.setImageBitmap((pos &  1 ) ==  1  ? mIcon1 : mIcon2);
return  convertView;
}
 
adapter更新效率比较:
 
1 的更新不到 10  frames/second
 
2 的更新接近 30  frames/second
 
3 的更新接近 40  frames/second
 
背景和图像
 
视图背景图像总会填充整个视图区域
 
1 。图像尺寸不合适会导致自动缩放
 
2 。避免实时缩放
 
3 。最好预先缩放到视图大小
 
originalImage = Bitmap.createScaledBitmap(
originalImage,  // 􂿕缩放图像
view.getWidth(),  // 视图宽度
view.getHeight(),  // 视图高度
true );  // 􀽮线性过滤器
 
1 的效率接近 25  frames/second
 
2 的效率接近 50  frames/second
 
默认情况下, 窗口有一个不透明的背景
 
有时可以不需要
 
     -􁭱􃧗最高层的视图是不透明的
 
     - 􁭱 最高层的视图覆盖整个窗口
 
layout_width = fill_parent
layout_height = fill_parent
 
更新看不见的背景是浪费时间
 
删除窗口背景:
 
1 。修改编码
 
public  void  onCreate(Bundle icicle){
super .onCreate(icicle);
setContentView(R.layout.mainview);
// 删除窗口背景
getWindow().setBackgroundDrawable( null );
...
 
2 。修改xml
 
  
 
首先确定你的res/values/styles.xml有
 
<resources>
<style name= "NoBackgroundTheme"  parent= "android:Theme" >
<item name= "android:windowBackground" > @null </item>
</style>
</resources>
 
然后编辑androidmainfest.xml
 
<activity android:name= "MyApplication"
android:theme= "@style/NoBackgroundTheme" >
...
</activity>
 
更新请求
 
当屏幕需要更新时,调用invalidate()方法,简单方便,但是更新了整个视图,代价太高。
 
最好先找到无效区域,然后调用
 
invalidate(Rect dirty);
invalidate( int  left,  int  top,  int  right,  int
bottom);
 
视图和布局
 
如果一个窗口包含很多视图,启动太慢,绘制时间长,用户界面反应速度很慢
 
解决方法:
 
1 。使用textview的复合drawable减少层次
 
<TextView
android:layout_width= "wrap_content"
android:layout_height= "wrap_content"
android:text= "@string/hello"
android:drawableLeft= "@drawable/icon" />
 
2 。使用viewstuf延迟展开视图
 
     在xml文件中定义viewstuf
 
<ViewStub android:id =  "@+id/stub_import"
android:inflatedId= "@+id/panel_import"
android:layout= "@layout/progress_overlay"
android:layout_width= "fill_parent"
android:layout_height= "wrap_content"
android:layout_gravity= "bottom" />
 
   在需要展开视图时,
 
findViewById(R.id.stub_import).setVisibility(View.VISIBLE);
// 或者
View importPanel = ((ViewStub)
findViewById(R.id.stub_import)).inflate();
 
3 。使用<merge>合并中间视图
 
默认情况下,布局文件的根作为一个节点,加入到父视图中,如果使用merge可以避免根节点
 
<merge xmlns:android =
"http://schemas.android.com/apk/res/android" >
<! -- Content -->
</merge>
 
4 。使用ralativelayout减少层次
 
<RelativeLayout xmlns:android= "http://schemas.android.com/apk/res/android"
android:layout_width= "fill_parent"  android:layout_height= "wrap_content" >
<ImageView android:id= "@+id/icon"
android:layout_width= "48dip"  android:layout_height= "48dip"
android:layout_alignParentLeft= "true"
android:layout_centerVertical= "true" />
<TextView android:layout_width= "wrap_content"
android:layout_height= "wrap_content"  android:id= "@+id/text_line1"
android:layout_alignParentTop= "true"
android:layout_toRightOf= "@id/icon" />
<TextView android:layout_width= "wrap_content"
android:layout_height= "wrap_content"  android:id= "@+id/text_line2"
android:layout_toRightOf= "@id/icon"
android:layout_below= "@id/text_line1" />
<Checkbox android:id= "@+id/star"
android:layout_width= "48dip"  android:layout_height= "48dip"
android:layout_alignParentRight= "true"
android:layout_centerVertical= "true" />
</RelativeLayout>
 
5 .使用自定义视图
 
class  CustomView  extends  View {
@Override
protected  void  onDraw(Canvas canvas) {
// 加入你的绘图编码
}
@Override
protected  void  onMeasure( int  widthMeasureSpec,
int  heightMeasureSpec) {
// 计算视图的尺寸
setMeasuredDimension(widthSpecSize, heightSpecSize);
}
}
 
6  使用自定义布局
 
class  GridLayout  extends  ViewGroup {
@Override
protected  void  onLayout( boolean  changed,  int  l,  int  t,
int  r,  int  b) {
final  int  count = getChildCount();
for  ( int  i= 0 ; i < count; i++) {
final  View child = getChildAt(i);
if  (child.getVisibility() != GONE) {
// 计算子视图的位置
child.layout(left, top, right, bottom);
}
}
}
}
 
内存分配
 
在性能敏感的代码里,避免创建java对象
 
1 。测量 onmeasure()
 
2 。布局onlayout()
 
3 。绘图 ondraw() dispatchdraw()
 
4 。事件处理 ontouchevent() dispatchtouchevent()
 
5 。adapter: getview() bindview()
 
强行限制(适用调试模式)
 
int  prevLimit = - 1 ;
try  {
prevLimit = Debug.setAllocationLimit( 0 );
// 执行不分配内存的代码
catch  (dalvik.system.AllocationLimitError e) {
// 如果代码分配内存, Java 虚拟机会抛出错误
Log.e(LOGTAG, e);
finally  {
Debug.setAllocationLimit(prevLimit);
}
 
管理好对象:
 
1 。适用软引用:内存缓存的最佳选择
 
2 。适用弱引用:避免内存泄露
 
内存缓存:
 
private  final  HashMap<String, SoftReference<T>> mCache;
public  void  put(String key, T value) {
mCache.put(key,  new  SoftReference<T>(value));
}
public  T get(String key, ValueBuilder builder) {
T value =  null ;
SoftReferece<T> reference = mCache.get(key);
if  (reference !=  null ) {
value = reference.get();


本文转自java豆子博客园博客,原文链接:http://www.cnblogs.com/error404/archive/2011/08/03/2126682.html,如需转载请自行联系原作者
相关文章
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1414 4
|
10月前
|
数据库 Android开发
Android使用EditText+Listview实现搜索效果(使用room模糊查询)
本文介绍如何在Android中使用EditText与ListView实现搜索功能,并结合Room数据库完成模糊查询。主要内容包括:Room的模糊查询语句(使用`||`代替`+`号)、布局美化(如去除ListView分割线和EditText下划线)、EditText回车事件监听,以及查询逻辑代码示例。此外,还提供了相关扩展文章链接,帮助读者深入了解ListView优化、动态搜索及Room基础操作。
642 65
|
11月前
|
存储 Android开发
如何查看Flutter应用在Android设备上已被撤销的权限?
如何查看Flutter应用在Android设备上已被撤销的权限?
570 64
|
5月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
747 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
6月前
|
存储 消息中间件 人工智能
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
468 10
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
3418 77
|
10月前
|
缓存 编解码 Android开发
Android内存优化之图片优化
本文主要探讨Android开发中的图片优化问题,包括图片优化的重要性、OOM错误的成因及解决方法、Android支持的图片格式及其特点。同时介绍了图片储存优化的三种方式:尺寸优化、质量压缩和内存重用,并详细讲解了相关的实现方法与属性。此外,还分析了图片加载优化策略,如异步加载、缓存机制、懒加载等,并结合多级缓存流程提升性能。最后对比了几大主流图片加载框架(Universal ImageLoader、Picasso、Glide、Fresco)的特点与适用场景,重点推荐Fresco在处理大图、动图时的优异表现。这些内容为开发者提供了全面的图片优化解决方案。
408 1
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
851 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
421 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
381 14