import java.io.BufferedOutputStream;

  1. import java.io.File;
  2. import java.io.FileNotFoundException;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.net.HttpURLConnection;
  7. import java.net.MalformedURLException;
  8. import java.net.URL;
  9. import java.util.WeakHashMap;
  10. import org.apache.http.HttpStatus;
  11. import com.android.lalala.util.lalalaApplication;
  12. import android.graphics.Bitmap;
  13. import android.graphics.Bitmap.CompressFormat;
  14. import android.graphics.BitmapFactory;
  15. import android.os.Handler;
  16. import android.widget.ImageView;
  17. /**
  18. * 图片下载与缓存 思路是,先查看内存,后检查SDcard,没有的话联网进行下载。
  19. */
  20. public class ImageLoader {
  21. private ImageView imageView = null;
  22. private String urlPath = "";
  23. private WeakHashMap<String, Bitmap> picsHashMap = null;
  24. private String urlHashCode = "";
  25. private String filePath = "";
  26. private Handler handler = null;
  27. private Bitmap handlerBitmap = null;
  28. /**
  29. * 构造器
  30. *
  31. * @param imageView
  32. *            imageview对象
  33. * @param urlPath
  34. *            下载的url地址
  35. * @param filePath
  36. *            缓存文件夹名称
  37. */
  38. public ImageLoader(ImageView imageView, String urlPath, String filePath) {
  39. super();
  40. this.imageView = imageView;
  41. this.urlPath = urlPath;
  42. this.filePath = filePath;
  43. urlHashCode = String.valueOf(urlPath.hashCode());
  44. // 从application中获取picHashMap对象
  45. picsHashMap = lalalaApplication.getInstance().getPicHashMap();
  46. handler = new Handler();
  47. new imageLoaderThread().start();
  48. }
  49. /**
  50. * 图片下载线程
  51. */
  52. private class imageLoaderThread extends Thread {
  53. @Override
  54. public void run() {
  55. super.run();
  56. if (readFromRAM()) {
  57. return;
  58. }
  59. if (readFromSDcard()) {
  60. return;
  61. }
  62. httpDownload();
  63. }
  64. }
  65. /**
  66. * 开始下载
  67. */
  68. private void httpDownload() {
  69. try {
  70. URL url = new URL(urlPath);
  71. HttpURLConnection connection = (HttpURLConnection) url
  72. .openConnection();
  73. connection.setConnectTimeout(10 * 1000);
  74. if (connection.getResponseCode() == HttpStatus.SC_OK) {
  75. InputStream is = connection.getInputStream();
  76. Bitmap bitmap = BitmapFactory.decodeStream(is);
  77. setBitmap(bitmap);
  78. lalalaApplication.getInstance().getPicHashMap()
  79. .put(urlHashCode, bitmap);
  80. saveToSDcard(bitmap);
  81. }
  82. } catch (MalformedURLException e) {
  83. e.printStackTrace();
  84. } catch (IOException e) {
  85. e.printStackTrace();
  86. }
  87. }
  88. /**
  89. * 将bitmap保存至SD卡上
  90. *
  91. * @param bitmap
  92. *            bitmap
  93. */
  94. private void saveToSDcard(Bitmap bitmap) {
  95. try {
  96. String fileName = filePath + "/" + urlHashCode + ".JPG";
  97. File file = new File(filePath);
  98. if (!file.exists()) {
  99. file.mkdir();
  100. }
  101. BufferedOutputStream outputStream = new BufferedOutputStream(
  102. new FileOutputStream(new File(fileName)));
  103. bitmap.compress(CompressFormat.JPEG, 100, outputStream);
  104. } catch (FileNotFoundException e) {
  105. e.printStackTrace();
  106. }
  107. }
  108. /**
  109. * 从内存中读取bitmap图片数据
  110. *
  111. * @return true内存中有数据 false 内存中无数据
  112. */
  113. private boolean readFromRAM() {
  114. if (picsHashMap.containsKey(urlHashCode)) {
  115. Bitmap bitmap = picsHashMap.get(urlHashCode);
  116. setBitmap(bitmap);
  117. return true;
  118. }
  119. return false;
  120. }
  121. /**
  122. * 从SD卡读取图片
  123. *
  124. * @return trueSDcard中有数据 false SDcard中无数据
  125. */
  126. private boolean readFromSDcard() {
  127. String fileName = filePath + "/" + urlHashCode + ".JPG";
  128. File file = new File(fileName);
  129. if (!file.exists()) {
  130. return false;
  131. } else {
  132. Bitmap bitmap = BitmapFactory.decodeFile(fileName);
  133. picsHashMap.put(urlHashCode, bitmap);
  134. setBitmap(bitmap);
  135. return true;
  136. }
  137. }
  138. /**
  139. * 设置图片
  140. *
  141. * @param bitmap
  142. *            图片
  143. */
  144. private void setBitmap(Bitmap bitmap) {
  145. this.handlerBitmap = bitmap;
  146. handler.post(new Runnable() {
  147. @Override
  148. public void run() {
  149. imageView.setImageBitmap(handlerBitmap);
  150. }
  151. });
  152. }
  153. }

android异步加载图片的更多相关文章

  1. 演化理解 Android 异步加载图片(转)

    演化理解 Android 异步加载图片(转)http://www.cnblogs.com/CJzhang/archive/2011/10/20/2218474.html

  2. 实例演示Android异步加载图片

    本文给大家演示异步加载图片的分析过程.让大家了解异步加载图片的好处,以及如何更新UI.首先给出main.xml布局文件:简单来说就是 LinearLayout 布局,其下放了2个TextView和5个 ...

  3. 实例演示Android异步加载图片(转)

    本文给大家演示异步加载图片的分析过程.让大家了解异步加载图片的好处,以及如何更新UI.首先给出main.xml布局文件:简单来说就是 LinearLayout 布局,其下放了2个TextView和5个 ...

  4. [Android]异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3574131.html  这个可以实现ImageView异步加载 ...

  5. 演化理解 Android 异步加载图片

    原文:http://www.cnblogs.com/ghj1976/archive/2011/05/06/2038738.html#3018499 在学习"Android异步加载图像小结&q ...

  6. android异步加载图片并缓存到本地实现方法

    图片过多造成内存溢出,这个是最不容易解决的,要想一些好的缓存策略,比如大图片使用LRU缓存策略或懒加载缓存策略.今天首先介绍一下本地缓存图片     在android项目中访问网络图片是非常普遍性的事 ...

  7. Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅

      Android 高手进阶(21)  版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明出处http://blog.csdn.net/xiaanming/article/details ...

  8. wemall app商城源码中基于JAVA的Android异步加载图片管理器代码

    wemall doraemon是Android客户端程序,服务端采用wemall微信商城,不对原商城做任何修改,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可随意定制修改.本文分享其中 ...

  9. Android之使用Android-AQuery异步加载图片(一)

    第一节:转载地址(http://www.cnblogs.com/lee0oo0/archive/2012/10/25/2738299.html) // 必须实现AQuery这个类 AQuery aq ...

随机推荐

  1. Careercup - Google面试题 - 5727310284062720

    2014-05-06 14:04 题目链接 原题: given an 2D matrix M, is filled either using X or O, you need to find the ...

  2. 3、颜色的字符串、十进制、十六进制相互转换(color convert between dec、hex and string )

    int color_int=***; 1.(十进制整数)转换成(十六进制的字符串) String color_hex = String.format("#%06X", (0xFFF ...

  3. Spring MVC mapping[From Spring MVC Beginner's Guide]

    In a Spring MVC application, the URL can logically be divided into five parts (see the following fig ...

  4. python 单元测试-unittest

    参考资料:https://docs.python.org/3.4/library/unittest.html#module-unittest 一张图解决问题: 涉及5块内容:case.suite.lo ...

  5. AJAX三种返回值方式

    (一)TEXT方式 该方式返回的是拼接字符串,想要取到其中的值,需要先将返回值进行拆分 (二)JSON方式 该方式返回的是数组,想要取到其中的值,可用索引项进行提取 (三)XML方式 XML:可扩展标 ...

  6. W3C和IE中的事件处理函数

    在上一篇文章中提到了关于传统的JS中注册事件对象的一些缺点和问题,下面是关于DOM2级的现代事件绑定.本文中设计到的HTML文件在文章最后 一.W3C事件处理函数 “DOM2 级事件”定义了两个方法, ...

  7. 服务器NPC的ID如何分配的

    服务器ID分配包括NPC,Monster,Pet的ID分配都是调用allocateUID然后自动保存的ID加一,pet说是通过玩家的ID移位获得的,调试一下发现还是调用allocateUID,如果通过 ...

  8. 查看Centos系统信息命令

    linux命令行具有强大的功能,我们安装vps后,首先应该知道系统信息,查看这些信息,你会发现Linux命令很简单,你可以按照下面的命令练习. linux系统信息 # uname -a # 查看内核/ ...

  9. QGraphics

    QGraphicsView和QGraphicsScene QGraphicsScene提供一个场景,可以添加各种item,QGraphicsView用于将元素显示,并支持旋转和缩放:可以将QGraph ...

  10. 《EnterLib PIAB深入剖析》系列博文汇总_转

    转: http://www.cnblogs.com/artech/archive/2008/08/08/1263418.html