下方所示的简单代码中,利用**AsyncTask** 在后台线程中加载图像,然后一旦完成便应用在UI中。也可以显示一个进度条来代替正在加载的图像。
1 |
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 利用AsyncTask在后台线程中加载缓慢的图像
new AsyncTask<ViewHolder, Void, Bitmap>() {
<span class="kd">private</span> <span class="n">ViewHolder</span> <span class="n">v</span><span class="o">;</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="n">Bitmap</span> <span class="nf">doInBackground</span><span class="o">(</span><span class="n">ViewHolder</span><span class="o">...</span> <span class="n">params</span><span class="o">)</span> <span class="o">{<!-- --></span>
<span class="n">v</span> <span class="o">=</span> <span class="n">params</span><span class="o">[</span><span class="mi">0</span><span class="o">];</span>
<span class="k">return</span> <span class="n">mFakeImageLoader</span><span class="o">.</span><span class="na">getImage</span><span class="o">();</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onPostExecute</span><span class="o">(</span><span class="n">Bitmap</span> <span class="n">result</span><span class="o">)</span> <span class="o">{<!-- --></span>
<span class="kd">super</span><span class="o">.</span><span class="na">onPostExecute</span><span class="o">(</span><span class="n">result</span><span class="o">);</span>
<span class="k">if</span> <span class="o">(</span><span class="n">v</span><span class="o">.</span><span class="na">position</span> <span class="o">==</span> <span class="n">position</span><span class="o">)</span> <span class="o">{<!-- --></span>
<span class="c1">// 如果该项还未被回收, 隐藏进度条,设置并显示图像</span>
<span class="n">v</span><span class="o">.</span><span class="na">progress</span><span class="o">.</span><span class="na">setVisibility</span><span class="o">(</span><span class="n">View</span><span class="o">.</span><span class="na">GONE</span><span class="o">);</span>
<span class="n">v</span><span class="o">.</span><span class="na">icon</span><span class="o">.</span><span class="na">setVisibility</span><span class="o">(</span><span class="n">View</span><span class="o">.</span><span class="na">VISIBLE</span><span class="o">);</span>
<span class="n">v</span><span class="o">.</span><span class="na">icon</span><span class="o">.</span><span class="na">setImageBitmap</span><span class="o">(</span><span class="n">result</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">}}.</span><span class="na">execute</span><span class="o">(</span><span class="n">holder</span><span class="o">);</span>
从Android3.0(API Level 11)起,在** AsyncTask** 中可以使用一项新的功能,你可以通过开启它来
在多处理器内核间交叉运行线程。除了调用** execute())**方法,你可以使用**executeOnExecutor())** 方法而同时执行多个请求,而这取决于可用的核心数量。
在View Holder中保存视图对象
你的代码可能在滑动** ListView**时频繁地调用**findViewById())**,而这可使效果变慢。即使在**Adapter**为了回收而返回一个已经展现出来的视图,你仍然需要查找这些元素并且更新他们。一个循环使用**findViewById())** 的方法是使用“view holder”设计模式。
一个**findViewById())** 对象存储布局内的每个组建视图的标记域,你可以立即访问而不需要反复的查询他们。首先,你需要建立一个类来保存具体的视图。例如:
1 |
2
3
4
5
6
static class ViewHolder {
TextView text;
TextView timestamp;
如果你进阶的路上缺乏方向,可以加入我们的圈子和安卓开发者们一起学习交流!
-
Android进阶学习全套手册
-
Android对标阿里P7学习视频
-
BATJ大厂Android高频面试题
最后,借用我最喜欢的乔布斯语录,作为本文的结尾:
人这一辈子没法做太多的事情,所以每一件都要做得精彩绝伦。
你的时间有限,所以不要为别人而活。不要被教条所限,不要活在别人的观念里。不要让别人的意见左右自己内心的声音。
最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实想法,其他一切都是次要。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!