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.网络缓存