android异步加载图片

简介:   import java.io.BufferedOutputStream;   import java.io.File;  import java.io.FileNotFoundException;  import java.

 

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.   
  11. import org.apache.http.HttpStatus;  
  12.   
  13. import com.android.lalala.util.lalalaApplication;  
  14.   
  15. import android.graphics.Bitmap;  
  16. import android.graphics.Bitmap.CompressFormat;  
  17. import android.graphics.BitmapFactory;  
  18. import android.os.Handler;  
  19. import android.widget.ImageView;  
  20.   
  21. /** 
  22.  * 图片下载与缓存 思路是,先查看内存,后检查SDcard,没有的话联网进行下载。 
  23.  */  
  24. public class ImageLoader {  
  25.     private ImageView imageView = null;  
  26.     private String urlPath = "";  
  27.     private WeakHashMap<String, Bitmap> picsHashMap = null;  
  28.     private String urlHashCode = "";  
  29.     private String filePath = "";  
  30.     private Handler handler = null;  
  31.     private Bitmap handlerBitmap = null;  
  32.   
  33.     /** 
  34.      * 构造器 
  35.      *  
  36.      * @param imageView 
  37.      *            imageview对象 
  38.      * @param urlPath 
  39.      *            下载的url地址 
  40.      * @param filePath 
  41.      *            缓存文件夹名称 
  42.      */  
  43.   
  44.     public ImageLoader(ImageView imageView, String urlPath, String filePath) {  
  45.         super();  
  46.         this.imageView = imageView;  
  47.         this.urlPath = urlPath;  
  48.         this.filePath = filePath;  
  49.         urlHashCode = String.valueOf(urlPath.hashCode());  
  50.         // 从application中获取picHashMap对象  
  51.         picsHashMap = lalalaApplication.getInstance().getPicHashMap();  
  52.         handler = new Handler();  
  53.         new imageLoaderThread().start();  
  54.     }  
  55.       
  56.     /** 
  57.      * 图片下载线程 
  58.      */  
  59.     private class imageLoaderThread extends Thread {  
  60.         @Override  
  61.         public void run() {  
  62.             super.run();  
  63.             if (readFromRAM()) {  
  64.                 return;  
  65.             }  
  66.             if (readFromSDcard()) {  
  67.                 return;  
  68.             }  
  69.             httpDownload();  
  70.         }  
  71.     }  
  72.   
  73.     /** 
  74.      * 开始下载 
  75.      */  
  76.     private void httpDownload() {  
  77.         try {  
  78.             URL url = new URL(urlPath);  
  79.             HttpURLConnection connection = (HttpURLConnection) url  
  80.                     .openConnection();  
  81.             connection.setConnectTimeout(10 * 1000);  
  82.             if (connection.getResponseCode() == HttpStatus.SC_OK) {  
  83.                 InputStream is = connection.getInputStream();  
  84.                 Bitmap bitmap = BitmapFactory.decodeStream(is);  
  85.                 setBitmap(bitmap);  
  86.                 lalalaApplication.getInstance().getPicHashMap()  
  87.                         .put(urlHashCode, bitmap);  
  88.                 saveToSDcard(bitmap);  
  89.             }  
  90.   
  91.         } catch (MalformedURLException e) {  
  92.             e.printStackTrace();  
  93.         } catch (IOException e) {  
  94.             e.printStackTrace();  
  95.         }  
  96.     }  
  97.   
  98.     /** 
  99.      * 将bitmap保存至SD卡上 
  100.      *  
  101.      * @param bitmap 
  102.      *            bitmap 
  103.      */  
  104.     private void saveToSDcard(Bitmap bitmap) {  
  105.         try {  
  106.             String fileName = filePath + "/" + urlHashCode + ".JPG";  
  107.         File file = new File(filePath);  
  108.         if (!file.exists()) {  
  109.             file.mkdir();  
  110.         }  
  111.             BufferedOutputStream outputStream = new BufferedOutputStream(  
  112.                     new FileOutputStream(new File(fileName)));  
  113.             bitmap.compress(CompressFormat.JPEG, 100, outputStream);  
  114.         } catch (FileNotFoundException e) {  
  115.             e.printStackTrace();  
  116.         }  
  117.   
  118.     }  
  119.   
  120.     /** 
  121.      * 从内存中读取bitmap图片数据 
  122.      *  
  123.      * @return true内存中有数据 false 内存中无数据 
  124.      */  
  125.     private boolean readFromRAM() {  
  126.         if (picsHashMap.containsKey(urlHashCode)) {  
  127.             Bitmap bitmap = picsHashMap.get(urlHashCode);  
  128.             setBitmap(bitmap);  
  129.             return true;  
  130.         }  
  131.         return false;  
  132.     }  
  133.   
  134.     /** 
  135.      * 从SD卡读取图片 
  136.      *  
  137.      * @return trueSDcard中有数据 false SDcard中无数据 
  138.      */  
  139.     private boolean readFromSDcard() {  
  140.         String fileName = filePath + "/" + urlHashCode + ".JPG";  
  141.         File file = new File(fileName);  
  142.         if (!file.exists()) {  
  143.             return false;  
  144.         } else {  
  145.             Bitmap bitmap = BitmapFactory.decodeFile(fileName);  
  146.             picsHashMap.put(urlHashCode, bitmap);  
  147.             setBitmap(bitmap);  
  148.             return true;  
  149.         }  
  150.   
  151.     }  
  152.   
  153.     /** 
  154.      * 设置图片 
  155.      *  
  156.      * @param bitmap 
  157.      *            图片 
  158.      */  
  159.     private void setBitmap(Bitmap bitmap) {  
  160.         this.handlerBitmap = bitmap;  
  161.         handler.post(new Runnable() {  
  162.             @Override  
  163.             public void run() {  
  164.                 imageView.setImageBitmap(handlerBitmap);  
  165.             }  
  166.         });  
  167.     }  
  168.   
  169.   
  170.   
  171. }  
相关文章
|
6月前
|
XML Java Android开发
Android Studio App开发之对图片进行简单加工(包括放缩,旋转等等 附源码)
Android Studio App开发之对图片进行简单加工(包括放缩,旋转等等 附源码)
113 0
|
6月前
|
XML Java Android开发
Android Studio App开发之使用相机拍摄照片和从相册中选取图片(附源码 超详细必看)
Android Studio App开发之使用相机拍摄照片和从相册中选取图片(附源码 超详细必看)
841 0
|
2月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
67 20
Android经典面试题之图片Bitmap怎么做优化
|
6月前
|
Android开发
Android通过手势(多点)缩放和拖拽图片
Android通过手势(多点)缩放和拖拽图片
53 4
|
6月前
|
Java Android开发
android 下载图片的问题
android 下载图片的问题
46 3
|
3月前
|
数据处理 开发工具 数据安全/隐私保护
Android平台RTMP推送|轻量级RTSP服务|GB28181接入之文字、png图片水印的精进之路
本文探讨了Android平台上推流模块中添加文字与PNG水印的技术演进。自2015年起,为了满足应急指挥及安防领域的需求,逐步发展出三代水印技术:第一代为静态文字与图像水印;第二代实现了动态更新水印内容的能力,例如实时位置与时间信息;至第三代,则优化了数据传输效率,直接使用Bitmap对象传递水印数据至JNI层,减少了内存拷贝次数。这些迭代不仅提升了用户体验和技术效率,也体现了开发者追求极致与不断创新的精神。
|
3月前
|
自然语言处理 定位技术 API
Android经典实战之如何获取图片的经纬度以及如何根据经纬度获取对应的地点名称
本文介绍如何在Android中从图片提取地理位置信息并转换为地址。首先利用`ExifInterface`获取图片内的经纬度,然后通过`Geocoder`将经纬度转为地址。注意操作需在子线程进行且考虑多语言支持。
239 4
|
3月前
|
XML 前端开发 Android开发
Android经典实战之Kotlin中实现圆角图片和圆形图片
本文介绍两种实现圆角图像视图的方法。第一种是通过自定义Kotlin `AppCompatImageView`,重写`onDraw`方法使用`Canvas`和`Path`进行圆角剪裁。第二种利用Android Material库中的`ShapeableImageView`,简单配置即可实现圆角效果。两种方法均易于实现且提供动态调整圆角半径的功能。
73 0
|
5月前
|
JSON 编解码 Apache
Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
64 1
|
5月前
|
Java Android开发
18. 【Android教程】图片控件 ImageView
18. 【Android教程】图片控件 ImageView
86 4