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

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  �?url
public void  netBitmap(ImageView ivPic,String strUrl) {   
new MyAsyncTask().execute(ivPic,strUrl);
}


class MyAsyncTask extends AsyncTask<Object, Void, Bitmap>{
//在子线程中运�? 耗时操作在里�?

private ImageView ivPic;
private String url;


@Override
protected Bitmap doInBackground(Object... params) {
 ivPic = (ImageView) params[0];
 url=(String) params[1];
 ivPic.setTag(url);//怕图片乱?
return downLoadBitmap(ivPic, url);
}

//更新进度
@Override
protected void onProgressUpdate(Void... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
}

//操作结束
@Override
protected 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 block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.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 block
e.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找到bitmap
bitmap.compress(CompressFormat.JPEG, 100, new FileOutputStream(file));
System.out.println("存到本地");
} catch (Exception e) {
// TODO Auto-generated catch block
e.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)){


@Override
protected 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值