单例模式<div class="crayon-tools">
<div class="crayon-button crayon-expand-button" title="Expand Code">
</div>
<div class="crayon-button crayon-copy-button" title="Expand Code">
</div>
<span class="crayon-language">Java</span></div> </div>
<div class="crayon-plain-wrap">
</div>
<div class="crayon-main">
<table class="crayon-table">
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-551b51a07ef64731569061-1">
1
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef64731569061-2">
2
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef64731569061-3">
3
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef64731569061-4">
4
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef64731569061-5">
5
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef64731569061-6">
6
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef64731569061-7">
7
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef64731569061-8">
8
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef64731569061-9">
9
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef64731569061-10">
10
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef64731569061-11">
11
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef64731569061-12">
12
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef64731569061-13">
13
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef64731569061-14">
14
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef64731569061-15">
15
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef64731569061-16">
16
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef64731569061-17">
17
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef64731569061-18">
18
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef64731569061-19">
19
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef64731569061-20">
20
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef64731569061-21">
21
</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-551b51a07ef64731569061-1" class="crayon-line">
<span class="crayon-m">public</span> <span class="crayon-t">class</span> <span class="crayon-e">Singleton</span> <span class="crayon-sy">{</span>
</div>
<div id="crayon-551b51a07ef64731569061-2" class="crayon-line crayon-striped-line">
</div>
<div id="crayon-551b51a07ef64731569061-3" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-m">private</span> <span class="crayon-m">static</span> <span class="crayon-t">Object</span><span class="crayon-h"> </span><span class="crayon-v">obj</span><span class="crayon-h"> </span><span class="crayon-o">=</span> <span class="crayon-r">new</span> <span class="crayon-t">Object</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07ef64731569061-4" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-m">private</span> <span class="crayon-m">static</span> <span class="crayon-e">Singleton </span><span class="crayon-v">instance</span> <span class="crayon-o">=</span> <span class="crayon-t">null</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07ef64731569061-5" class="crayon-line">
</div>
<div id="crayon-551b51a07ef64731569061-6" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-m">private</span> <span class="crayon-e">Singleton</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">{</span>
</div>
<div id="crayon-551b51a07ef64731569061-7" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-sy">}</span>
</div>
<div id="crayon-551b51a07ef64731569061-8" class="crayon-line crayon-striped-line">
</div>
<div id="crayon-551b51a07ef64731569061-9" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-m">public</span> <span class="crayon-m">static</span> <span class="crayon-e">Singleton </span><span class="crayon-e">getInstance</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span> <span class="crayon-sy">{</span>
</div>
<div id="crayon-551b51a07ef64731569061-10" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-c">// if already inited, no need to get lock everytime</span>
</div>
<div id="crayon-551b51a07ef64731569061-11" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-st">if</span> <span class="crayon-sy">(</span><span class="crayon-v">instance</span> <span class="crayon-o">==</span> <span class="crayon-t">null</span><span class="crayon-sy">)</span> <span class="crayon-sy">{</span>
</div>
<div id="crayon-551b51a07ef64731569061-12" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-m">synchronized</span> <span class="crayon-sy">(</span><span class="crayon-i">obj</span><span class="crayon-sy">)</span> <span class="crayon-sy">{</span>
</div>
<div id="crayon-551b51a07ef64731569061-13" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-st">if</span> <span class="crayon-sy">(</span><span class="crayon-v">instance</span> <span class="crayon-o">==</span> <span class="crayon-t">null</span><span class="crayon-sy">)</span> <span class="crayon-sy">{</span>
</div>
<div id="crayon-551b51a07ef64731569061-14" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-v">instance</span> <span class="crayon-o">=</span> <span class="crayon-r">new</span> <span class="crayon-e">Singleton</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07ef64731569061-15" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-sy">}</span>
</div>
<div id="crayon-551b51a07ef64731569061-16" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-sy">}</span>
</div>
<div id="crayon-551b51a07ef64731569061-17" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-sy">}</span>
</div>
<div id="crayon-551b51a07ef64731569061-18" class="crayon-line crayon-striped-line">
</div>
<div id="crayon-551b51a07ef64731569061-19" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-st">return</span> <span class="crayon-i">instance</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07ef64731569061-20" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-sy">}</span>
</div>
<div id="crayon-551b51a07ef64731569061-21" class="crayon-line">
<span class="crayon-sy">}</span>
</div>
</div>
</td>
</tr>
</table>
</div></div>
**
(2). 缓存
程序中用到了图片缓存、线程池、View缓存、IO缓存、消息缓存、通知栏notification缓存**等。
**a. 图片缓存:**见ImageCache和ImageSdCache
**
b. 线程池:**使用Java的Executors类,通过newCachedThreadPool、newFixedThreadPool、newSingleThreadExecutor、newScheduledThreadPool提供四种不同类型的线程池
**
c. View缓存:**
可见[ListView缓存机制](http://www.trinea.cn/android/android-listview%e6%bb%91%e5%8a%a8%e8%bf%87%e7%a8%8b%e4%b8%ad%e5%9b%be%e7%89%87%e6%98%be%e7%a4%ba%e9%87%8d%e5%a4%8d%e9%94%99%e4%b9%b1%e9%97%aa%e7%83%81%e9%97%ae%e9%a2%98%e8%a7%a3%e5%86%b3/)
<div id="crayon-551b51a07ef74524581893" class="crayon-syntax crayon-theme-arduino-ide crayon-font-monaco crayon-os-pc print-yes" data-settings=" no-popup scroll-mouseover wrap">
<div class="crayon-toolbar" data-settings=" show">
<span class="crayon-title">listView的getView缓存</span>
<div class="crayon-tools">
<div class="crayon-button crayon-expand-button" title="Expand Code">
</div>
<div class="crayon-button crayon-copy-button" title="Expand Code">
</div>
<span class="crayon-language">Java</span></div> </div>
<div class="crayon-plain-wrap">
</div>
<div class="crayon-main">
<table class="crayon-table">
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-551b51a07ef74524581893-1">
1
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef74524581893-2">
2
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef74524581893-3">
3
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef74524581893-4">
4
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef74524581893-5">
5
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef74524581893-6">
6
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef74524581893-7">
7
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef74524581893-8">
8
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef74524581893-9">
9
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef74524581893-10">
10
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef74524581893-11">
11
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef74524581893-12">
12
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef74524581893-13">
13
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef74524581893-14">
14
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef74524581893-15">
15
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef74524581893-16">
16
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef74524581893-17">
17
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef74524581893-18">
18
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef74524581893-19">
19
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef74524581893-20">
20
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef74524581893-21">
21
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef74524581893-22">
22
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef74524581893-23">
23
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef74524581893-24">
24
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef74524581893-25">
25
</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-551b51a07ef74524581893-1" class="crayon-line">
<span class="crayon-n">@Override</span>
</div>
<div id="crayon-551b51a07ef74524581893-2" class="crayon-line crayon-striped-line">
<span class="crayon-m">public</span> <span class="crayon-e">View </span><span class="crayon-e">getView</span><span class="crayon-sy">(</span><span class="crayon-t">int</span> <span class="crayon-i">position</span><span class="crayon-sy">,</span> <span class="crayon-e">View </span><span class="crayon-i">convertView</span><span class="crayon-sy">,</span> <span class="crayon-e">ViewGroup </span><span class="crayon-r">parent</span><span class="crayon-sy">)</span> <span class="crayon-sy">{</span>
</div>
<div id="crayon-551b51a07ef74524581893-3" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-e">ViewHolder </span><span class="crayon-i">holder</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07ef74524581893-4" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-st">if</span> <span class="crayon-sy">(</span><span class="crayon-v">convertView</span> <span class="crayon-o">==</span> <span class="crayon-t">null</span><span class="crayon-sy">)</span> <span class="crayon-sy">{</span>
</div>
<div id="crayon-551b51a07ef74524581893-5" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-v">convertView</span> <span class="crayon-o">=</span> <span class="crayon-v">inflater</span><span class="crayon-sy">.</span><span class="crayon-e">inflate</span><span class="crayon-sy">(</span><span class="crayon-v">R</span><span class="crayon-sy">.</span><span class="crayon-v">layout</span><span class="crayon-sy">.</span><span class="crayon-i">type_item</span><span class="crayon-sy">,</span> <span class="crayon-t">null</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07ef74524581893-6" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-v">holder</span> <span class="crayon-o">=</span> <span class="crayon-r">new</span> <span class="crayon-e">ViewHolder</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07ef74524581893-7" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-v">holder</span><span class="crayon-sy">.</span><span class="crayon-v">imageView</span> <span class="crayon-o">=</span> <span class="crayon-sy">(</span><span class="crayon-i">ImageView</span><span class="crayon-sy">)</span><span class="crayon-v">convertView</span><span class="crayon-sy">.</span><span class="crayon-e">findViewById</span><span class="crayon-sy">(</span><span class="crayon-v">R</span><span class="crayon-sy">.</span><span class="crayon-v">id</span><span class="crayon-sy">.</span><span class="crayon-i">app_icon</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07ef74524581893-8" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-v">holder</span><span class="crayon-sy">.</span><span class="crayon-v">textView</span> <span class="crayon-o">=</span> <span class="crayon-sy">(</span><span class="crayon-i">TextView</span><span class="crayon-sy">)</span><span class="crayon-v">convertView</span><span class="crayon-sy">.</span><span class="crayon-e">findViewById</span><span class="crayon-sy">(</span><span class="crayon-v">R</span><span class="crayon-sy">.</span><span class="crayon-v">id</span><span class="crayon-sy">.</span><span class="crayon-i">app_name</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07ef74524581893-9" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-v">convertView</span><span class="crayon-sy">.</span><span class="crayon-e">setTag</span><span class="crayon-sy">(</span><span class="crayon-i">holder</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07ef74524581893-10" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-sy">}</span> <span class="crayon-st">else</span> <span class="crayon-sy">{</span>
</div>
<div id="crayon-551b51a07ef74524581893-11" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-v">holder</span> <span class="crayon-o">=</span> <span class="crayon-sy">(</span><span class="crayon-i">ViewHolder</span><span class="crayon-sy">)</span><span class="crayon-v">convertView</span><span class="crayon-sy">.</span><span class="crayon-e">getTag</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07ef74524581893-12" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-sy">}</span>
</div>
<div id="crayon-551b51a07ef74524581893-13" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-v">holder</span><span class="crayon-sy">.</span><span class="crayon-v">imageView</span><span class="crayon-sy">.</span><span class="crayon-e">setImageResource</span><span class="crayon-sy">(</span><span class="crayon-v">R</span><span class="crayon-sy">.</span><span class="crayon-v">drawable</span><span class="crayon-sy">.</span><span class="crayon-i">index_default_image</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07ef74524581893-14" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-v">holder</span><span class="crayon-sy">.</span><span class="crayon-v">textView</span><span class="crayon-sy">.</span><span class="crayon-e">setText</span><span class="crayon-sy">(</span><span class="crayon-s">“”</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07ef74524581893-15" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-st">return</span> <span class="crayon-i">convertView</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07ef74524581893-16" class="crayon-line crayon-striped-line">
<span class="crayon-sy">}</span>
</div>
<div id="crayon-551b51a07ef74524581893-17" class="crayon-line">
</div>
<div id="crayon-551b51a07ef74524581893-18" class="crayon-line crayon-striped-line">
<span class="crayon-c">/**</span>
</div>
<div id="crayon-551b51a07ef74524581893-19" class="crayon-line">
<span class="crayon-c"> * ViewHolder</span>
</div>
<div id="crayon-551b51a07ef74524581893-20" class="crayon-line crayon-striped-line">
<span class="crayon-c"> */</span>
</div>
<div id="crayon-551b51a07ef74524581893-21" class="crayon-line">
<span class="crayon-m">static</span> <span class="crayon-t">class</span> <span class="crayon-e">ViewHolder</span> <span class="crayon-sy">{</span>
</div>
<div id="crayon-551b51a07ef74524581893-22" class="crayon-line crayon-striped-line">
</div>
<div id="crayon-551b51a07ef74524581893-23" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-e">ImageView </span><span class="crayon-i">imageView</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07ef74524581893-24" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-e">TextView </span><span class="crayon-i">textView</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07ef74524581893-25" class="crayon-line">
<span class="crayon-sy">}</span>
</div>
</div>
</td>
</tr>
</table>
</div></div>
通过convertView是否为null减少layout inflate次数,通过静态的ViewHolder减少findViewById的次数,这两个函数尤其是inflate是相当费时间的
**
d. IO缓存:**
使用具有缓存策略的输入流,BufferedInputStream替代InputStream,BufferedReader替代Reader,BufferedReader替代BufferedInputStream.对文件、网络IO皆适用。
**
e. 消息缓存:**通过 Handler 的 obtainMessage 回收 Message 对象,减少 Message 对象的创建开销
handler.sendMessage(handler.obtainMessage(1));
**
f. 通知栏notification缓存:**下载中需要不断改变通知栏进度条状态,如果不断新建Notification会导致通知栏很卡。这里我们可以使用最简单的缓存
Map<String, Notification> notificationMap = new HashMap<String, Notification>();如果notificationMap中不存在,则新建notification并且put into map.
**
(3). 其他**
**能创建基类解决问题就不用具体子类:**除需要设置优先级的线程使用new Thread创建外,其余线程创建使用new Runnable。因为子类会有自己的属性创建需要更多开销。
**控制最大并发数量:**使用Java的Executors类,通过Executors.newFixedThreadPool(nThreads)控制线程池最大线程并发
对于http请求增加timeout
**3. [Layout优化](http://www.trinea.cn/android/layout-performance/)**
使用抽象布局标签(include, viewstub, merge)、去除不必要的嵌套和View节点、减少不必要的infalte及其他Layout方面可调优点,顺带提及布局调优相关工具(hierarchy viewer和lint)。具体可见性能优化之布局优化
TextView属性优化:TextView的android:ellipsize=”marquee”跑马灯效果极耗性能,具体原因还在深入源码中
**4. 数据库优化**
主要包括索引和事务及针对Sqlite的优化。具体可见性能优化之数据库优化
**
算法优化**
这个就是个博大精深的话题了,只介绍本应用中使用的。
使用hashMap代替arrayList,时间复杂度降低一个数量级
**
延迟执行**
对于很多耗时逻辑没必要立即执行,这时候我们可以将其延迟执行。
线程延迟执行 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(10);
消息延迟发送 handler.sendMessageDelayed(handler.obtainMessage(0), 1000);
**
四、本程序性能调优结果**
1. ViewPager左右滑动明显卡顿
2. GridView上下滚动明显卡顿
(1). 去掉TextView的android:ellipsize=”marquee”
(2). 修改图片缓存的最大线程数,增加http timeout
(3). 修改设置app是否已安装的状态,具体代码修改如下:
<div id="crayon-551b51a07ef89354600387" class="crayon-syntax crayon-theme-arduino-ide crayon-font-monaco crayon-os-pc print-yes" data-settings=" no-popup minimize scroll-mouseover wrap">
<div class="crayon-toolbar" data-settings=" show">
<div class="crayon-tools">
<div class="crayon-button crayon-expand-button" title="Expand Code">
</div>
<div class="crayon-button crayon-copy-button" title="Expand Code">
</div>
<span class="crayon-language">Java</span></div> </div>
<div class="crayon-plain-wrap">
</div>
<div class="crayon-main">
<table class="crayon-table">
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-551b51a07ef89354600387-1">
1
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef89354600387-2">
2
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef89354600387-3">
3
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef89354600387-4">
4
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef89354600387-5">
5
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef89354600387-6">
6
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef89354600387-7">
7
</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-551b51a07ef89354600387-1" class="crayon-line">
<span class="crayon-i">List</span><span class="crayon-e "><PackageInfo></span> <span class="crayon-v">installedPackageList</span> <span class="crayon-o">=</span> <span class="crayon-e">getPackageManager</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">.</span><span class="crayon-e">getInstalledPackages</span><span class="crayon-sy">(</span><span class="crayon-v">PackageManager</span><span class="crayon-sy">.</span><span class="crayon-i">GET_UNINSTALLED_PACKAGES</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07ef89354600387-2" class="crayon-line crayon-striped-line">
<span class="crayon-i">List</span><span class="crayon-e "><App></span> <span class="crayon-v">installedAppList</span> <span class="crayon-o">=</span> <span class="crayon-t">function</span><span class="crayon-sy">(</span><span class="crayon-i">installedAppList</span><span class="crayon-sy">)</span>
</div>
<div id="crayon-551b51a07ef89354600387-3" class="crayon-line">
<span class="crayon-st">for</span> <span class="crayon-sy">(</span><span class="crayon-e">App </span><span class="crayon-i">app</span> <span class="crayon-o">:</span> <span class="crayon-i">appList</span><span class="crayon-sy">)</span> <span class="crayon-sy">{</span>
</div>
<div id="crayon-551b51a07ef89354600387-4" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-st">for</span> <span class="crayon-sy">(</span><span class="crayon-e">App </span><span class="crayon-i">installedApp</span> <span class="crayon-o">:</span> <span class="crayon-i">installedAppList</span><span class="crayon-sy">)</span> <span class="crayon-sy">{</span>
</div>
<div id="crayon-551b51a07ef89354600387-5" class="crayon-line">
</div>
<div id="crayon-551b51a07ef89354600387-6" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-sy">}</span>
</div>
<div id="crayon-551b51a07ef89354600387-7" class="crayon-line">
<span class="crayon-sy">}</span>
</div>
</div>
</td>
</tr>
</table>
</div></div>
修改为
<div id="crayon-551b51a07ef94240085498" class="crayon-syntax crayon-theme-arduino-ide crayon-font-monaco crayon-os-pc print-yes" data-settings=" no-popup minimize scroll-mouseover wrap">
<div class="crayon-toolbar" data-settings=" show">
<div class="crayon-tools">
<div class="crayon-button crayon-expand-button" title="Expand Code">
</div>
<div class="crayon-button crayon-copy-button" title="Expand Code">
</div>
<span class="crayon-language">Java</span></div> </div>
<div class="crayon-plain-wrap">
</div>
<div class="crayon-main">
<table class="crayon-table">
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-551b51a07ef94240085498-1">
1
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef94240085498-2">
2
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef94240085498-3">
3
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef94240085498-4">
4
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef94240085498-5">
5
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef94240085498-6">
6
</div>
<div class="crayon-num" data-line="crayon-551b51a07ef94240085498-7">
7
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07ef94240085498-8">
8
</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-551b51a07ef94240085498-1" class="crayon-line">
<span class="crayon-st">for</span> <span class="crayon-sy">(</span><span class="crayon-e">App </span><span class="crayon-i">app</span> <span class="crayon-o">:</span> <span class="crayon-i">appList</span><span class="crayon-sy">)</span> <span class="crayon-sy">{</span>
</div>
<div id="crayon-551b51a07ef94240085498-2" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-i">Pair</span><span class="crayon-o"><</span><span class="crayon-t">Integer</span><span class="crayon-sy">,</span> <span class="crayon-t">String</span><span class="crayon-o">></span> <span class="crayon-v">versionInfo</span> <span class="crayon-o">=</span> <span class="crayon-v">INSTALLED_APP_MAP</span><span class="crayon-sy">.</span><span class="crayon-e">get</span><span class="crayon-sy">(</span><span class="crayon-v">app</span><span class="crayon-sy">.</span><span class="crayon-e">getPackageName</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07ef94240085498-3" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-st">if</span> <span class="crayon-sy">(</span><span class="crayon-i">versionInfo</span> <span class="crayon-o">!=</span> <span class="crayon-t">null</span><span class="crayon-sy">)</span> <span class="crayon-sy">{</span>
</div>
<div id="crayon-551b51a07ef94240085498-4" class="crayon-line crayon-striped-line">
</div>
<div id="crayon-551b51a07ef94240085498-5" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-sy">}</span> <span class="crayon-st">else</span> <span class="crayon-sy">{</span>
</div>
<div id="crayon-551b51a07ef94240085498-6" class="crayon-line crayon-striped-line">
</div>
<div id="crayon-551b51a07ef94240085498-7" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-sy">}</span>
</div>
<div id="crayon-551b51a07ef94240085498-8" class="crayon-line crayon-striped-line">
<span class="crayon-sy">}</span>
</div>
</div>
</td>
</tr>
</table>
</div></div>
从每次获取List<PackageInfo> installedAppList = getPackageManager().getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);修改为只在有应用安装或卸载广播时获取应用列表,并且用hashMap代替installedAppList减少查询时间。
将平均执行时间从201ms降低到1ms。
**
其他Activity返回ViewPager Activity较慢**
定位:在onStart函数
解决:使用延迟策略,具体代码修改如下:
<div id="crayon-551b51a07efa0984029811" class="crayon-syntax crayon-theme-arduino-ide crayon-font-monaco crayon-os-pc print-yes" data-settings=" no-popup minimize scroll-mouseover wrap">
<div class="crayon-toolbar" data-settings=" show">
<div class="crayon-tools">
<div class="crayon-button crayon-expand-button" title="Expand Code">
</div>
<div class="crayon-button crayon-copy-button" title="Expand Code">
</div>
<span class="crayon-language">Java</span></div> </div>
<div class="crayon-plain-wrap">
</div>
<div class="crayon-main">
<table class="crayon-table">
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-551b51a07efa0984029811-1">
1
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07efa0984029811-2">
2
</div>
<div class="crayon-num" data-line="crayon-551b51a07efa0984029811-3">
3
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07efa0984029811-4">
4
</div>
<div class="crayon-num" data-line="crayon-551b51a07efa0984029811-5">
5
</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-551b51a07efa0984029811-1" class="crayon-line">
<span class="crayon-n">@Override</span>
</div>
<div id="crayon-551b51a07efa0984029811-2" class="crayon-line crayon-striped-line">
<span class="crayon-m">public</span> <span class="crayon-t">void</span> <span class="crayon-e">onStart</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span> <span class="crayon-sy">{</span>
</div>
<div id="crayon-551b51a07efa0984029811-3" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-r">super</span><span class="crayon-sy">.</span><span class="crayon-e">onStart</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07efa0984029811-4" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-v">appUpdateListAdapter</span><span class="crayon-sy">.</span><span class="crayon-e">notifyDataSetChanged</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07efa0984029811-5" class="crayon-line">
<span class="crayon-sy">}</span>
</div>
</div>
</td>
</tr>
</table>
</div></div>
改为
<div id="crayon-551b51a07efaa052277268" class="crayon-syntax crayon-theme-arduino-ide crayon-font-monaco crayon-os-pc print-yes" data-settings=" no-popup scroll-mouseover wrap">
<div class="crayon-toolbar" data-settings=" show">
<span class="crayon-title">优化后代码</span>
<div class="crayon-tools">
<div class="crayon-button crayon-expand-button" title="Expand Code">
</div>
<div class="crayon-button crayon-copy-button" title="Expand Code">
</div>
<span class="crayon-language">Java</span></div> </div>
<div class="crayon-plain-wrap">
</div>
<div class="crayon-main">
<table class="crayon-table">
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-551b51a07efaa052277268-1">
1
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07efaa052277268-2">
2
</div>
<div class="crayon-num" data-line="crayon-551b51a07efaa052277268-3">
3
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07efaa052277268-4">
4
</div>
<div class="crayon-num" data-line="crayon-551b51a07efaa052277268-5">
5
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07efaa052277268-6">
6
</div>
<div class="crayon-num" data-line="crayon-551b51a07efaa052277268-7">
7
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07efaa052277268-8">
8
</div>
<div class="crayon-num" data-line="crayon-551b51a07efaa052277268-9">
9
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07efaa052277268-10">
10
</div>
<div class="crayon-num" data-line="crayon-551b51a07efaa052277268-11">
11
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07efaa052277268-12">
12
</div>
<div class="crayon-num" data-line="crayon-551b51a07efaa052277268-13">
13
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07efaa052277268-14">
14
</div>
<div class="crayon-num" data-line="crayon-551b51a07efaa052277268-15">
15
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07efaa052277268-16">
16
</div>
<div class="crayon-num" data-line="crayon-551b51a07efaa052277268-17">
17
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07efaa052277268-18">
18
</div>
<div class="crayon-num" data-line="crayon-551b51a07efaa052277268-19">
19
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07efaa052277268-20">
20
</div>
<div class="crayon-num" data-line="crayon-551b51a07efaa052277268-21">
21
</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-551b51a07efaa052277268-1" class="crayon-line">
<span class="crayon-m">public</span> <span class="crayon-t">void</span> <span class="crayon-e">onStart</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span> <span class="crayon-sy">{</span>
</div>
<div id="crayon-551b51a07efaa052277268-2" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-r">super</span><span class="crayon-sy">.</span><span class="crayon-e">onStart</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07efaa052277268-3" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-c">// delay send message</span>
</div>
<div id="crayon-551b51a07efaa052277268-4" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-v">handler</span><span class="crayon-sy">.</span><span class="crayon-e">sendMessageDelayed</span><span class="crayon-sy">(</span><span class="crayon-v">handler</span><span class="crayon-sy">.</span><span class="crayon-e">obtainMessage</span><span class="crayon-sy">(</span><span class="crayon-v">MessageConstants</span><span class="crayon-sy">.</span><span class="crayon-i">WHAT_NOTIFY_DATA_CHANGED</span><span class="crayon-sy">)</span><span class="crayon-sy">,</span> <span class="crayon-cn">100</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07efaa052277268-5" class="crayon-line">
<span class="crayon-sy">}</span>
</div>
<div id="crayon-551b51a07efaa052277268-6" class="crayon-line crayon-striped-line">
</div>
<div id="crayon-551b51a07efaa052277268-7" class="crayon-line">
<span class="crayon-m">private</span> <span class="crayon-t">class</span> <span class="crayon-e">MyHandler</span> <span class="crayon-r">extends</span> <span class="crayon-e">Handler</span> <span class="crayon-sy">{</span>
</div>
<div id="crayon-551b51a07efaa052277268-8" class="crayon-line crayon-striped-line">
</div>
<div id="crayon-551b51a07efaa052277268-9" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-n">@Override</span>
</div>
<div id="crayon-551b51a07efaa052277268-10" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-m">public</span> <span class="crayon-t">void</span> <span class="crayon-e">handleMessage</span><span class="crayon-sy">(</span><span class="crayon-e">Message </span><span class="crayon-i">msg</span><span class="crayon-sy">)</span> <span class="crayon-sy">{</span>
</div>
<div id="crayon-551b51a07efaa052277268-11" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-r">super</span><span class="crayon-sy">.</span><span class="crayon-e">handleMessage</span><span class="crayon-sy">(</span><span class="crayon-i">msg</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07efaa052277268-12" class="crayon-line crayon-striped-line">
</div>
<div id="crayon-551b51a07efaa052277268-13" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-st">switch</span> <span class="crayon-sy">(</span><span class="crayon-v">msg</span><span class="crayon-sy">.</span><span class="crayon-i">what</span><span class="crayon-sy">)</span> <span class="crayon-sy">{</span>
</div>
<div id="crayon-551b51a07efaa052277268-14" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-st">case</span> <span class="crayon-v">MessageConstants</span><span class="crayon-sy">.</span><span class="crayon-i">WHAT_NOTIFY_DATA_CHANGED</span><span class="crayon-o">:</span>
</div>
<div id="crayon-551b51a07efaa052277268-15" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-st">if</span> <span class="crayon-sy">(</span><span class="crayon-i">appUpdateListAdapter</span> <span class="crayon-o">!=</span> <span class="crayon-t">null</span><span class="crayon-sy">)</span> <span class="crayon-sy">{</span>
</div>
<div id="crayon-551b51a07efaa052277268-16" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-v">appUpdateListAdapter</span><span class="crayon-sy">.</span><span class="crayon-e">notifyDataSetChanged</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07efaa052277268-17" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-sy">}</span>
</div>
<div id="crayon-551b51a07efaa052277268-18" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-st">break</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07efaa052277268-19" class="crayon-line">
<span class="crayon-h"> </span><span class="crayon-sy">}</span>
</div>
<div id="crayon-551b51a07efaa052277268-20" class="crayon-line crayon-striped-line">
<span class="crayon-h"> </span><span class="crayon-sy">}</span>
</div>
<div id="crayon-551b51a07efaa052277268-21" class="crayon-line">
<span class="crayon-sy">}</span>
</div>
</div>
</td>
</tr>
</table>
</div></div>
**
网络获取到展现速度较慢**
定位:在HttpURLConnection.getInputStream()之后的处理
解决:使用BufferedReader替代BufferedInputStream获取时间从100ms降低到3ms,具体代码修改如下:
<div id="crayon-551b51a07efb7617197317" class="crayon-syntax crayon-theme-arduino-ide crayon-font-monaco crayon-os-pc print-yes" data-settings=" no-popup minimize scroll-mouseover wrap">
<div class="crayon-toolbar" data-settings=" show">
<div class="crayon-tools">
<div class="crayon-button crayon-expand-button" title="Expand Code">
</div>
<div class="crayon-button crayon-copy-button" title="Expand Code">
</div>
<span class="crayon-language">Java</span></div> </div>
<div class="crayon-plain-wrap">
</div>
<div class="crayon-main">
<table class="crayon-table">
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-551b51a07efb7617197317-1">
1
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07efb7617197317-2">
2
</div>
<div class="crayon-num" data-line="crayon-551b51a07efb7617197317-3">
3
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07efb7617197317-4">
4
</div>
<div class="crayon-num" data-line="crayon-551b51a07efb7617197317-5">
5
</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-551b51a07efb7617197317-1" class="crayon-line">
<span class="crayon-e">HttpURLConnection </span><span class="crayon-v">con</span> <span class="crayon-o">=</span> <span class="crayon-sy">(</span><span class="crayon-i">HttpURLConnection</span><span class="crayon-sy">)</span><span class="crayon-v">url</span><span class="crayon-sy">.</span><span class="crayon-e">openConnection</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07efb7617197317-2" class="crayon-line crayon-striped-line">
<span class="crayon-e">InputStream </span><span class="crayon-v">input</span> <span class="crayon-o">=</span> <span class="crayon-v">con</span><span class="crayon-sy">.</span><span class="crayon-e">getInputStream</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07efb7617197317-3" class="crayon-line">
</div>
<div id="crayon-551b51a07efb7617197317-4" class="crayon-line crayon-striped-line">
</div>
<div id="crayon-551b51a07efb7617197317-5" class="crayon-line">
<span class="crayon-sy">}</span>
</div>
</div>
</td>
</tr>
</table>
</div></div>
改为
<div id="crayon-551b51a07efcc003116771" class="crayon-syntax crayon-theme-arduino-ide crayon-font-monaco crayon-os-pc print-yes" data-settings=" no-popup minimize scroll-mouseover wrap">
<div class="crayon-toolbar" data-settings=" show">
<div class="crayon-tools">
<div class="crayon-button crayon-expand-button" title="Expand Code">
</div>
<div class="crayon-button crayon-copy-button" title="Expand Code">
</div>
<span class="crayon-language">Java</span></div> </div>
<div class="crayon-plain-wrap">
</div>
<div class="crayon-main">
<table class="crayon-table">
<tr class="crayon-row">
<td class="crayon-nums " data-settings="show">
<div class="crayon-nums-content">
<div class="crayon-num" data-line="crayon-551b51a07efcc003116771-1">
1
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07efcc003116771-2">
2
</div>
<div class="crayon-num" data-line="crayon-551b51a07efcc003116771-3">
3
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07efcc003116771-4">
4
</div>
<div class="crayon-num" data-line="crayon-551b51a07efcc003116771-5">
5
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-551b51a07efcc003116771-6">
6
</div>
</div>
</td>
<td class="crayon-code">
<div class="crayon-pre">
<div id="crayon-551b51a07efcc003116771-1" class="crayon-line">
<span class="crayon-e">HttpURLConnection </span><span class="crayon-v">con</span> <span class="crayon-o">=</span> <span class="crayon-sy">(</span><span class="crayon-i">HttpURLConnection</span><span class="crayon-sy">)</span><span class="crayon-v">url</span><span class="crayon-sy">.</span><span class="crayon-e">openConnection</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07efcc003116771-2" class="crayon-line crayon-striped-line">
<span class="crayon-e">BufferedReader </span><span class="crayon-v">input</span> <span class="crayon-o">=</span> <span class="crayon-r">new</span> <span class="crayon-e">BufferedReader</span><span class="crayon-sy">(</span><span class="crayon-r">new</span> <span class="crayon-e">InputStreamReader</span><span class="crayon-sy">(</span><span class="crayon-v">con</span><span class="crayon-sy">.</span><span class="crayon-e">getInputStream</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">)</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07efcc003116771-3" class="crayon-line">
<span class="crayon-t">String</span> <span class="crayon-i">s</span><span class="crayon-sy">;</span>
</div>
<div id="crayon-551b51a07efcc003116771-4" class="crayon-line crayon-striped-line">
<span class="crayon-st">while</span> <span class="crayon-sy">(</span><span class="crayon-sy">(</span><span class="crayon-v">s</span> <span class="crayon-o">=</span> <span class="crayon-v">input</span><span class="crayon-sy">.</span><span class="crayon-e">readLine</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">)</span> <span class="crayon-o">!=</span> <span class="crayon-t">null</span><span class="crayon-sy">)</span> <span class="crayon-sy">{</span>
</div>
<div id="crayon-551b51a07efcc003116771-5" class="crayon-line">
</div>
<div id="crayon-551b51a07efcc003116771-6" class="crayon-line crayon-striped-line">
<span class="crayon-sy">}</span>
</div>
</div>
</td>
</tr>
</table>
转自:http://www.trinea.cn/android/android-performance-demo/
</div></div>
💬 评论