图片的三级缓存和异步加载

来源:互联网 发布:kbar软件下载 编辑:程序博客网 时间:2024/05/02 00:52

import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.graphics.BitmapFactory;import android.graphics.BitmapFactory.Options;import android.os.AsyncTask;import android.widget.ImageView;public class NetBitmap {LocalBitmap localBitmap;LruCacheBitmap lruCacheBitmap;public NetBitmap(LocalBitmap localBitmap,LruCacheBitmap lruCacheBitmap) {this.localBitmap = localBitmap;this.lruCacheBitmap=lruCacheBitmap;}//联网要的是image  �?urlpublic void  netBitmap(ImageView ivPic,String strUrl) {   new MyAsyncTask().execute(ivPic,strUrl);}class MyAsyncTask extends AsyncTask<Object, Void, Bitmap>{//在子线程中运�? 耗时操作在里�?private ImageView ivPic;private String url;@Overrideprotected Bitmap doInBackground(Object... params) { ivPic = (ImageView) params[0]; url=(String) params[1]; ivPic.setTag(url);//怕图片乱?return downLoadBitmap(ivPic, url);}//更新进度@Overrideprotected void onProgressUpdate(Void... values) {// TODO Auto-generated method stubsuper.onProgressUpdate(values);}//操作结束@Overrideprotected void onPostExecute(Bitmap result) {if (result!=null) {//tag封装的url取出?String bingdurl=(String) ivPic.getTag();if (url.equals(bingdurl)) {//这里是联?ivPic.setImageBitmap(result);System.out.println("这里是联网NetBitmap");//把result   bitmap对象放在本地缓存?localBitmap.setBitmapToCache(url, result);System.out.println("联网之后存本地NetBitmap");lruCacheBitmap.setBitmapToCache(url, result);System.out.println("联网之后存到内存NetBitmap");}}}}public Bitmap downLoadBitmap(ImageView ivPic,String strUrl){Bitmap bitmap;HttpURLConnection conn = null;try {URL url=new URL(strUrl);conn=(HttpURLConnection) url.openConnection();conn.setDoInput(true);conn.connect();int response = conn.getResponseCode();if (response==200) {InputStream in=conn.getInputStream();BitmapFactory.Options options=new BitmapFactory.Options();options.inSampleSize=2;options.inPreferredConfig=Config.ARGB_4444;bitmap=BitmapFactory.decodeStream(in, null, options);in.close();return bitmap;}} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{conn.disconnect();}return null;}}2.本地缓存import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.OutputStream;import android.graphics.Bitmap;import android.graphics.Bitmap.CompressFormat;import android.graphics.BitmapFactory;import android.os.Environment;public class LocalBitmap {public static final String CACHE_PATH=Environment.getExternalStorageDirectory().getAbsolutePath()+"/sport_viewpager";//从本地缓存中�?public Bitmap getBitmapfromCache(String url){try {Bitmap bitmap;//File file=new File(CACHE_PATH, url);File file=new File(CACHE_PATH, MD5Encoder.encode(url));System.out.println("看本地中有没有数据");if (file.exists()) {bitmap = BitmapFactory.decodeStream(new FileInputStream(file));return bitmap;}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}//设置到本地缓存中public void setBitmapToCache(String url,Bitmap bitmap){File dirfile=new File(CACHE_PATH);if (!dirfile.exists() || !dirfile.isDirectory()) {dirfile.mkdirs();}try {//把url加密加到file里面//File file=new File(CACHE_PATH, url);File file=new File(CACHE_PATH, MD5Encoder.encode(url));//把图片保存到文件里面  然后通过url找到bitmapbitmap.compress(CompressFormat.JPEG, 100, new FileOutputStream(file));System.out.println("存到本地");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}} 3.内存缓存 在这里我用的是Lrucache  没有用软,弱引用。import android.graphics.Bitmap;import android.support.v4.util.LruCache;public class LruCacheBitmap {private LruCache<String, Bitmap>mMemoryCache;public LruCacheBitmap(){long maxSize = Runtime.getRuntime().maxMemory();mMemoryCache=new LruCache<String, Bitmap>((int) (maxSize/8)){@Overrideprotected int sizeOf(String key, Bitmap value) {int getbytes = value.getRowBytes()*value.getHeight();return getbytes;}};}public Bitmap getBitmapFromCache(String url){System.out.println("看内存当中有没有数据Lru");return mMemoryCache.get(url);}public void setBitmapToCache(String url,Bitmap bitmap){System.out.println("放入到内存当中Lru");mMemoryCache.put(url, bitmap);}}4.然后在MyBitmapUtils 中统一管理去在adapter中调用  import android.content.Context;import android.graphics.Bitmap;import android.widget.ImageView;public class MyBitmapUtils {private NetBitmap netbitmap;private LocalBitmap localBitmap;private LruCacheBitmap lruCacheBitmap;public MyBitmapUtils(Context context){localBitmap=new LocalBitmap();lruCacheBitmap=new LruCacheBitmap();netbitmap=new NetBitmap(localBitmap, lruCacheBitmap);}public void display(ImageView ivpic,String strUrl){Bitmap bitmap;//内存bitmap=lruCacheBitmap.getBitmapFromCache(strUrl);if (bitmap!=null) {System.out.println("有从内存当中拿到图片");ivpic.setImageBitmap(bitmap);return;}//本地bitmap=localBitmap.getBitmapfromCache(strUrl);if (bitmap!=null) {System.out.println("有从本地缓存中拿到数据");ivpic.setImageBitmap(bitmap);lruCacheBitmap.setBitmapToCache(strUrl, bitmap);return;}//联网netbitmap.netBitmap(ivpic, strUrl);System.out.println("网络联网拿到数据");}}5.其中还加了MD5的算法import java.security.MessageDigest;public class MD5Encoder {public static String encode(String string) throws Exception {   byte[] hash = MessageDigest.getInstance("MD5").digest(string.getBytes("UTF-8"));   StringBuilder hex = new StringBuilder(hash.length * 2);   for (byte b : hash) {       if ((b & 0xFF) < 0x10) {        hex.append("0");       }       hex.append(Integer.toHexString(b & 0xFF));   }   return hex.toString();}}当然要在项目清单里面去加一些权限   <uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

1.网络缓存   2.本地缓存    3.内存缓存

一般是先从网络去下载  然后缓存到本地和内存 看你的需求

1.网络缓存


0 0
原创粉丝点击