[转载]Android关于ListView (1)——异步加载图片

[转载]关于ListView (1)——异步加载图片 – 没有代码 – 博客园.

效果:

主要解决listview读取图片时界面无响应的问题,当然这个方法也可以扩展到读取数据库数据等等

项目的布局如下:

首先加入网络的权限

<uses-permission Android:name=”Android.permission.INTERNET” />

工具类,主要根据url读取图片返回流的方法

Request.java

<span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Request</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="typ">InputStream</span><span class="pln"> </span><span class="typ">HandlerData</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> url</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 
</span><span class="typ">InputStream</span><span class="pln"> inStream</span><span class="pun">=</span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
 
</span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 
URL feedUrl </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> URL</span><span class="pun">(</span><span class="pln">url</span><span class="pun">);</span><span class="pln">
 
</span><span class="typ">URLConnection</span><span class="pln"> conn </span><span class="pun">=</span><span class="pln"> feedUrl</span><span class="pun">.</span><span class="pln">openConnection</span><span class="pun">();</span><span class="pln">
 
conn</span><span class="pun">.</span><span class="pln">setConnectTimeout</span><span class="pun">(</span><span class="lit">10</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">);</span><span class="pln">
 
inStream </span><span class="pun">=</span><span class="pln"> conn</span><span class="pun">.</span><span class="pln">getInputStream</span><span class="pun">();</span><span class="pln">
 
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Exception</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 
e</span><span class="pun">.</span><span class="pln">printStackTrace</span><span class="pun">();</span><span class="pln">
 
</span><span class="pun">}</span><span class="pln">
 
</span><span class="kwd">return</span><span class="pln"> inStream</span><span class="pun">;</span><span class="pln">
 
</span><span class="pun">}</span><span class="pln">
 
</span><span class="pun">}</span><span class="pln">
</span>

ListViewReadImageAscy.java

<span class="kwd">private</span><span class="pln"> </span><span class="typ">ImageAdapter</span><span class="pln"> adapter</span><span class="pun">;</span><span class="pln">
 
</span><span class="com">//数据源</span><span class="pln">
 
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pln"> beans </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">();</span><span class="pln">
 
</span><span class="com">//内部类</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Bean</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Bitmap</span><span class="pln"> image</span><span class="pun">;</span><span class="pln">
 
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Bitmap</span><span class="pln"> getImage</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 
</span><span class="kwd">return</span><span class="pln"> image</span><span class="pun">;</span><span class="pln">
 
</span><span class="pun">}</span><span class="pln">
 
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setImage</span><span class="pun">(</span><span class="typ">Bitmap</span><span class="pln"> image</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">image </span><span class="pun">=</span><span class="pln"> image</span><span class="pun">;</span><span class="pln">
 
</span><span class="pun">}</span><span class="pln">
 
</span><span class="pun">}</span><span class="pln">
</span>

扩展BaseAdapter

<span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ImageAdapter</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">BaseAdapter</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">ImageAdapter</span><span class="pun">(</span><span class="typ">Context</span><span class="pln"> context</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 
</span><span class="pun">}</span><span class="pln">
 
</span><span class="lit">@Override</span><span class="pln">
 
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> getCount</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 
</span><span class="kwd">return</span><span class="pln"> beans</span><span class="pun">.</span><span class="pln">size</span><span class="pun">();</span><span class="pln">
 
</span><span class="pun">}</span><span class="pln">
 
</span><span class="lit">@Override</span><span class="pln">
 
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Bean</span><span class="pln"> getItem</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> position</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 
</span><span class="kwd">return</span><span class="pln"> beans</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="pln">position</span><span class="pun">);</span><span class="pln">
 
</span><span class="pun">}</span><span class="pln">
 
</span><span class="lit">@Override</span><span class="pln">
 
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">long</span><span class="pln"> getItemId</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> position</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 
</span><span class="kwd">return</span><span class="pln"> position</span><span class="pun">;</span><span class="pln">
 
</span><span class="pun">}</span><span class="pln">
 
</span><span class="lit">@Override</span><span class="pln">
 
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">View</span><span class="pln"> getView</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> position</span><span class="pun">,</span><span class="pln"> </span><span class="typ">View</span><span class="pln"> convertView</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ViewGroup</span><span class="pln"> parent</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 
</span><span class="typ">ImageView</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ImageView</span><span class="pun">(</span><span class="pln">getApplicationContext</span><span class="pun">());</span><span class="pln">
 
</span><span class="typ">Bean</span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> beans</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="pln">position</span><span class="pun">);</span><span class="pln">
 
</span><span class="com">//如果有图片则读取,没有则跳过</span><span class="pln">
 
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">b</span><span class="pun">.</span><span class="pln">getImage</span><span class="pun">()</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 
i</span><span class="pun">.</span><span class="pln">setImageBitmap</span><span class="pun">(</span><span class="pln">b</span><span class="pun">.</span><span class="pln">getImage</span><span class="pun">());</span><span class="pln">
 
</span><span class="pun">}</span><span class="pln">
 
</span><span class="kwd">return</span><span class="pln"> i</span><span class="pun">;</span><span class="pln">
 
</span><span class="pun">}</span><span class="pln">
 
</span><span class="pun">}</span><span class="pln">
</span>

/异步加载图片,为了简洁这里请求图片链接先固定。每读取好一个图片就更新,这里界面比较简单,当然你可以做成比较好的,像很多好的软件都有这种效果,先一个loading的效果,一旦有图片了就去掉loading,显示图片。

//这里还啰嗦一点就是AsyncTask里面重载的方法doInBackground操作不能涉及到更新UI界面,不然会出错。虽这样说,但是有时候遇到像我这种情况时,是很难知道出错就是这个原因导致的。异步加载一个view时,如果那个view里面有EditText,EditText在每次加载view都会触发焦点,这时候异步就会出错。可能我这样说不太清楚,但是如果试试就会发现这种情况。

<span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ImageLoadTask</span><span class="pln"> </span><span class="kwd">extends</span><span class="pln"> </span><span class="typ">AsyncTask</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">ImageAdapter</span><span class="pln"> adapter</span><span class="pun">;</span><span class="pln">
 
</span><span class="com">// 初始化</span><span class="pln">
 
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">ImageLoadTask</span><span class="pun">(</span><span class="typ">Context</span><span class="pln"> context</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ImageAdapter</span><span class="pln"> adapter</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">adapter </span><span class="pun">=</span><span class="pln"> adapter</span><span class="pun">;</span><span class="pln">
 
</span><span class="pun">}</span><span class="pln">
 
</span><span class="lit">@Override</span><span class="pln">
 
</span><span class="kwd">protected</span><span class="pln"> </span><span class="typ">Void</span><span class="pln"> doInBackground</span><span class="pun">(</span><span class="typ">Void</span><span class="pun">...</span><span class="pln"> </span><span class="kwd">params</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&</span><span class="pln">lt</span><span class="pun">;</span><span class="pln"> adapter</span><span class="pun">.</span><span class="pln">getCount</span><span class="pun">();</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 
</span><span class="typ">Bean</span><span class="pln"> bean </span><span class="pun">=</span><span class="pln"> adapter</span><span class="pun">.</span><span class="pln">getItem</span><span class="pun">(</span><span class="pln">i</span><span class="pun">);</span><span class="pln">
 
</span><span class="typ">Bitmap</span><span class="pln"> bitmap </span><span class="pun">=</span><span class="pln"> </span><span class="typ">BitmapFactory</span><span class="pln">
 
</span><span class="pun">.</span><span class="pln">decodeStream</span><span class="pun">(</span><span class="typ">Request</span><span class="pln">
 
</span><span class="pun">.</span><span class="typ">HandlerData</span><span class="pun">(</span><span class="str">"http://avatar.profile.csdn.net/A/E/5/2_piaopiaohu123.jpg"</span><span class="pun">));</span><span class="pln">
 
bean</span><span class="pun">.</span><span class="pln">setImage</span><span class="pun">(</span><span class="pln">bitmap</span><span class="pun">);</span><span class="pln">
 
publishProgress</span><span class="pun">();</span><span class="pln"> </span><span class="com">// 通知去更新UI</span><span class="pln">
 
</span><span class="pun">}</span><span class="pln">
 
</span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
 
</span><span class="pun">}</span><span class="pln">
 
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onProgressUpdate</span><span class="pun">(</span><span class="typ">Void</span><span class="pun">...</span><span class="pln"> voids</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isCancelled</span><span class="pun">())</span><span class="pln">
 
</span><span class="kwd">return</span><span class="pun">;</span><span class="pln">
 
</span><span class="com">// 更新UI</span><span class="pln">
 
adapter</span><span class="pun">.</span><span class="pln">notifyDataSetChanged</span><span class="pun">();</span><span class="pln">
 
</span><span class="pun">}</span><span class="pln">
 
</span><span class="pun">}</span><span class="pln">
</span>

设置数据源

<span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span class="typ">Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
 
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&</span><span class="pln">lt</span><span class="pun">;</span><span class="pln"> </span><span class="lit">15</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">Bean</span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Bean</span><span class="pun">();</span><span class="pln">
b</span><span class="pun">.</span><span class="pln">setImage</span><span class="pun">(</span><span class="typ">BitmapFactory</span><span class="pun">.</span><span class="pln">decodeResource</span><span class="pun">(</span><span class="pln">getResources</span><span class="pun">(),</span><span class="pln">
R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">icon</span><span class="pun">));</span><span class="pln">
 
beans</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="pln">b</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
 
adapter </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ImageAdapter</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">);</span><span class="pln">
</span><span class="typ">ListView</span><span class="pln"> listview </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ListView</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">);</span><span class="pln">
listview</span><span class="pun">.</span><span class="pln">setAdapter</span><span class="pun">(</span><span class="pln">adapter</span><span class="pun">);</span><span class="pln">
adapter</span><span class="pun">.</span><span class="pln">notifyDataSetChanged</span><span class="pun">();</span><span class="pln">
setContentView</span><span class="pun">(</span><span class="pln">listview</span><span class="pun">);</span><span class="pln">
 
</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ImageLoadTask</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">,</span><span class="pln"> adapter</span><span class="pun">).</span><span class="pln">execute</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span>

本文为原创,如需转载,请注明作者和出处,谢谢!

http://www.cnblogs.com/not-code/archive/2011/05/03/2035421.html

代码下载

http://files.cnblogs.com/not-code/ListViewReadImageAsyn.rar

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

登录

注册