提高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,如需转载请自行联系原作者
相关文章
|
16天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
17天前
|
数据库 Android开发 开发者
构建高效Android应用:Kotlin协程的实践指南
【4月更文挑战第2天】随着移动应用开发的不断进步,开发者们寻求更流畅、高效的用户体验。在Android平台上,Kotlin语言凭借其简洁性和功能性赢得了开发社区的广泛支持。特别是Kotlin协程,作为一种轻量级的并发处理方案,使得异步编程变得更加简单和直观。本文将深入探讨Kotlin协程的核心概念、使用场景以及如何将其应用于Android开发中,以提高应用性能和响应能力。通过实际案例分析,我们将展示协程如何简化复杂任务,优化资源管理,并为最终用户提供更加流畅的体验。
|
2天前
|
缓存 移动开发 Android开发
构建高效Android应用:从优化用户体验到提升性能表现
【4月更文挑战第18天】 在移动开发的世界中,打造一个既快速又流畅的Android应用并非易事。本文深入探讨了如何通过一系列创新的技术策略来提升应用性能和用户体验。我们将从用户界面(UI)设计的简约性原则出发,探索响应式布局和Material Design的实践,再深入剖析后台任务处理、内存管理和电池寿命优化的技巧。此外,文中还将讨论最新的Android Jetpack组件如何帮助开发者更高效地构建高质量的应用。此内容不仅适合经验丰富的开发者深化理解,也适合初学者构建起对Android高效开发的基础认识。
2 0
|
2天前
|
移动开发 Android开发 开发者
构建高效Android应用:采用Kotlin进行内存优化的策略
【4月更文挑战第18天】 在移动开发领域,性能优化一直是开发者关注的焦点。特别是对于Android应用而言,由于设备和版本的多样性,确保应用流畅运行且占用资源少是一大挑战。本文将探讨使用Kotlin语言开发Android应用时,如何通过内存优化来提升应用性能。我们将从减少不必要的对象创建、合理使用数据结构、避免内存泄漏等方面入手,提供实用的代码示例和最佳实践,帮助开发者构建更加高效的Android应用。
5 0
|
3天前
|
缓存 移动开发 Java
构建高效的Android应用:内存优化策略
【4月更文挑战第16天】 在移动开发领域,尤其是针对资源有限的Android设备,内存优化是提升应用性能和用户体验的关键因素。本文将深入探讨Android应用的内存管理机制,分析常见的内存泄漏问题,并提出一系列实用的内存优化技巧。通过这些策略的实施,开发者可以显著减少应用的内存占用,避免不必要的后台服务,以及提高垃圾回收效率,从而延长设备的电池寿命并确保应用的流畅运行。
|
5天前
|
搜索推荐 开发工具 Android开发
安卓即时应用(Instant Apps)开发指南
【4月更文挑战第14天】Android Instant Apps让用户体验部分应用功能而无需完整下载。开发者需将应用拆分成模块,基于已上线的基础应用构建。使用Android Studio的Instant Apps Feature Library定义模块特性,优化代码与资源以减小模块大小,同步管理即时应用和基础应用的版本。经过测试,可发布至Google Play Console,提升用户便利性,创造新获客机会。
|
6天前
|
Java API 调度
安卓多线程和并发处理:提高应用效率
【4月更文挑战第13天】本文探讨了安卓应用中多线程和并发处理的优化方法,包括使用Thread、AsyncTask、Loader、IntentService、JobScheduler、WorkManager以及线程池。此外,还介绍了RxJava和Kotlin协程作为异步编程工具。理解并恰当运用这些技术能提升应用效率,避免UI卡顿,确保良好用户体验。随着安卓技术发展,更高级的异步处理工具将助力开发者构建高性能应用。
|
6天前
|
编解码 人工智能 测试技术
安卓适配性策略:确保应用在不同设备上的兼容性
【4月更文挑战第13天】本文探讨了提升安卓应用兼容性的策略,包括理解平台碎片化、设计响应式UI(使用dp单位,考虑横竖屏)、利用Android SDK的兼容工具(支持库、资源限定符)、编写兼容性代码(运行时权限、设备特性检查)以及优化性能以适应低端设备。适配性是安卓开发的关键,通过这些方法可确保应用在多样化设备上提供一致体验。未来,自动化测试和AI将助力应对设备碎片化挑战。
|
8天前
|
存储 数据库 Android开发
构建高效安卓应用:采用Jetpack架构组件优化用户体验
【4月更文挑战第12天】 在当今快速发展的数字时代,Android 应用程序的流畅性与响应速度对用户满意度至关重要。为提高应用性能并降低维护成本,开发者需寻求先进的技术解决方案。本文将探讨如何利用 Android Jetpack 中的架构组件 — 如 LiveData、ViewModel 和 Room — 来构建高质量的安卓应用。通过具体实施案例分析,我们将展示这些组件如何协同工作以实现数据持久化、界面与逻辑分离,以及确保数据的即时更新,从而优化用户体验并提升应用的可维护性和可测试性。
|
12天前
|
移动开发 API Android开发
构建高效Android应用:探究Kotlin协程的优势与实践
【4月更文挑战第7天】 在移动开发领域,性能优化和应用响应性的提升一直是开发者追求的目标。近年来,Kotlin语言因其简洁性和功能性在Android社区中受到青睐,特别是其对协程(Coroutines)的支持,为编写异步代码和处理并发任务提供了一种更加优雅的解决方案。本文将探讨Kotlin协程在Android开发中的应用,揭示其在提高应用性能和简化代码结构方面的潜在优势,并展示如何在实际项目中实现和优化协程。