天天看点

Android多线程下载远程图片

修改后的代码

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

<code>import</code> <code>java.io.InputStream;</code>

<code>import</code> <code>java.lang.ref.WeakReference;</code>

<code>import</code> <code>java.net.HttpURLConnection;</code>

<code>import</code> <code>java.net.URL;</code>

<code>import</code> <code>android.graphics.Bitmap;</code>

<code>import</code> <code>android.graphics.BitmapFactory;</code>

<code>import</code> <code>android.os.AsyncTask;</code>

<code>import</code> <code>android.util.Log;</code>

<code>import</code> <code>android.widget.ImageView;</code>

<code>/**</code>

<code> </code><code>* @类名:ImageDownloader</code>

<code> </code><code>* @功能描述:优化的ImageDownloader, 不带缓存,在线下载,用户头像请使用。</code>

<code> </code><code>* @作者: William Xu</code>

<code> </code><code>* @创建日期:2013-6-7</code>

<code> </code><code>* @修改人:</code>

<code> </code><code>* @修改日期:</code>

<code> </code><code>* @修改备注:</code>

<code> </code><code>* @版本号:1.0</code>

<code> </code><code>*/</code>

<code>public</code> <code>class</code> <code>ImageDownloader {</code>

<code>    </code><code>public</code> <code>void</code> <code>download(String url, ImageView imageView) {</code>

<code>        </code><code>BitmapDownloaderTask task = </code><code>new</code> <code>BitmapDownloaderTask(imageView);</code>

<code>        </code><code>task.execute(url);</code>

<code>    </code><code>}</code>

<code>    </code><code>class</code> <code>BitmapDownloaderTask </code><code>extends</code> <code>AsyncTask&lt;String, Void, Bitmap&gt; {</code>

<code>          </code> 

<code>        </code><code>private</code> <code>final</code> <code>WeakReference&lt;ImageView&gt; imageViewReference; </code><code>// 使用WeakReference解决内存问题</code>

<code>        </code><code>public</code> <code>BitmapDownloaderTask(ImageView imageView) {</code>

<code>            </code><code>imageViewReference = </code><code>new</code> <code>WeakReference&lt;ImageView&gt;(imageView);</code>

<code>        </code><code>}</code>

<code>        </code><code>@Override</code>

<code>        </code><code>protected</code> <code>Bitmap doInString...  params) { </code><code>// 实际的下载线程,内部其实是concurrent线程,所以不会阻塞</code>

<code>            </code><code>Bitmap bitmap = </code><code>null</code><code>;</code>

<code>            </code><code>try</code> <code>{</code>

<code>                </code><code>URL imageUrl = </code><code>new</code> <code>URL(params[</code><code>0</code><code>]);</code>

<code>                </code><code>HttpURLConnection conn = (HttpURLConnection) imageUrl</code>

<code>                        </code><code>.openConnection();</code>

<code>                </code><code>conn.setConnectTimeout(</code><code>30000</code><code>);</code>

<code>                </code><code>conn.setReadTimeout(</code><code>30000</code><code>);</code>

<code>                </code><code>conn.setInstanceFollowRedirects(</code><code>true</code><code>);</code>

<code>                </code><code>InputStream is = conn.getInputStream();</code>

<code>                </code><code>bitmap = BitmapFactory.decodeStream(is);</code>

<code>            </code><code>} </code><code>catch</code> <code>(Exception ex) {</code>

<code>                </code><code>Log.e(</code><code>""</code><code>,</code>

<code>                        </code><code>"getBitmap catch Exception...\nmessage = "</code>

<code>                                </code><code>+ ex.getMessage());</code>

<code>            </code><code>}</code>

<code>            </code><code>return</code> <code>bitmap;</code>

<code>        </code><code>protected</code> <code>void</code> <code>onPostExecute(Bitmap bitmap) { </code><code>// 下载完后执行的</code>

<code>            </code><code>if</code> <code>(isCancelled()) {</code>

<code>                </code><code>bitmap = </code><code>null</code><code>;</code>

<code>            </code><code>if</code> <code>(imageViewReference != </code><code>null</code><code>) {</code>

<code>                  </code> 

<code>                </code><code>ImageView imageView = imageViewReference.get();</code>

<code>                </code><code>if</code> <code>(imageView != </code><code>null</code> <code>&amp;&amp; bitmap != </code><code>null</code><code>) {</code>

<code>                      </code> 

<code>                    </code><code>imageView.setImageBitmap(bitmap); </code><code>// 下载完设置imageview为刚才下载的bitmap对象</code>

<code>                </code><code>}</code>

<code>}</code>

本文转自william_xu 51CTO博客,原文链接:http://blog.51cto.com/williamx/1218518,如需转载请自行联系原作者

继续阅读