// FileCache.java
import java.io.File;
import android.content.Context;
public class FileCache{
private FileCacheDir;
public FileCache(Context context){
if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
cacheDir = new File(android.os.Environmet.getExternalStrorageDirectory(),"文件夹名称");
else
cacheDir = context.getCacheDir();
if(!cacheDir.exsts())
cache.mkdirs();
}
public File getFile(String url){
String fileName = String.valueOf(url.hashCode());
File file = new File(cacheDir,fileName);
return file;
}
public void clear(){
File[] files = cacheDir.listFiles();
if(files == null)
return;
for(File file:files)
{
file.delete();
}
}
}
// HttpUtil.java
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoudException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;
/**
* Http请求工具类
*/
public class HttpUtil{
public static String getResponseStr(String path,Map<String,String>parameters){
StringBuffer buffer = new StringBuffer();
URL url;
try{
if(parameters!=null&¶meters.isEmpty()){
for(Map.Entry<String,String>entry:parameters.entrySet()){
buffer.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(),"UTF-8")).append("&");
}
buffer.deleteCharAt(buffer.length()-1);
}
url = new URL(path);
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
urlConnection.setConnectTimeout(3000);
urlConnection.SetRequesMethod("POST");
urlConnection.SetDoInput(true);
urlConnection.SetDoOutput(true);
//
byte[] mydata = buffer.toString().getBytes();
urlConnection.setRequesProperty("Content-Type","application.x-www-form-urlencoded");
urlConnection.setRequesProperty("Content-Length",String.valueOf(mydata.length));
// 获取输出流,向服务器输出数据
OutputStream outputStream = urlConnection.getOutputStream();
outputStream.write(mydata,0,mydata.length());
outputStream.close();
int responseCode = urlConnection.getResponseCode();
if(responseCode == 200){
return changeInuptstream(urlConnection.getInputStream());
}catch(UnsupportedEncodingException e){
e.printStackTrace();
}catch(MalformedURLException e){
e.printStackTrace();
}catch(ProtocolException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
retun null;
}
private static String changeInputStream(InputStream inputStream){
ByteArrayOutpoutStream outputStream = new ByteArrayOutputStream();
byte[] data = new byte[1024];
int len = 0;
String result = "";
if(inputStream != null){
try{
while((len = inputStream.read(data)) != -1){
outputStream.write(data,0,len);
}
result = new String(outputStream.toByteArray(),"UTF-8");
}catch(IOException){
e.printStacckTrace();
}
}
return result;
}
public static InputStream getInputStream(String path){
URL url;
try{
url = new URL(path);
HttpURLConnection urlConnection = (HttpURLConnection)url.open.Connection();
urlConnecation.setConnectTimeout(3000);
urlConnecation.setRequestMethod("GET");
urlConnecation.setDoInput(true);
urlConnecation.connect();
if(urlConnection.getResponseCode == 200)
return urlConnection.getInputStream();
}catch(MalformedURLException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}catch(Exception e){
e.printStacjTrace();
}
return null;
}
public satatic byte[] readStream(InputStream inStream)throwsException{
ByteArrayOutputStream outSteam = newByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while((len = inStream.read(buffer)) != -1){
outStream.write(buffer,0,len);
}
outStream.close();
inStream.close();
return outStream.toByteArray();
}
public static void copyStream(String url,File f){
FileOutputStream fileOutputStream = null;
InputStream inputStream = null;
try{
inputStream = getInputStream(url);
byte[] data = new byte[1024];
int len = 0;
fileOutputStream = new FileOutputStream(f);
while((len = inputStream.read(data)) != -1){
fileOutputStream.write(data,0,len);
}
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}finally{
if(inputStream != null){
try{
inputStream.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}
// MemoryCache.java
import java.lang.ref.SoftReference;
import java.util.Collections;
import jave.util.HashMap;
import java.util.Map;
import android.graphics.Bitmap;
public class MemoryCache{
private Map<String,SoftReference<Bitmap>> cache = Collections.sycnchronizedMap(newHashMap<String,SoftReference<Bitmap>>());//软引用
public Bitmapget(String id){
if(!cache.containsKey(id))
return null;
SoftReference<Bitmap> ref = cache.get(id);
return ref.get();
}
public void put(String id,Bitmap bitmap){
cache.put(id,newSoftReferce<Bitmap>(bitmap));
}
public void clear(){
cache.clear();
}
}
// ImageLoader.java
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.UnsupportedEncodingException;
import java.io.net.URLEncoder;
import java.io.util.Collections;
import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.grapgics.BitmapFactory;
import android.grapgics.drawable.BitmapDrawable;
import android.widget.ImageView;
public class ImageLoader{
private MemoryCachemoryCache = new MemoryCache();
private FileCache fileCache;
private Map<ImageView,String> imageViews = Collections.synchronizedMap(new WeakHashMap<ImageView,String>());
private ExecutorService executorService;
private boolean isSrc;
public ImageLoader(Context context,boolean flag){
fileCache = new FileCache(context);
executorService = Executors.newFixedThreadPool(5);
isSrc = flag;
}
final int stub_id = R.drawable.ic_launcher;
public void DisplayImage(String url,ImageView imageView){
String u1 = url.substring(0,url.lastIndexOf("/")+1);
String u2 = url.substring(url,lastIndexOf("/")+1);
try{
u2 = URLEncoder.encode(u2,"UTF-8");
}catch(UnsupportedEncodingException e){
e.printStackTrace();
}
url = u1 +u2;
imageViews.put(imageView,rul);
Bitmap bitmap = memoryCache.get(url);
if(bitmap != null){
if(isSrc)
imageView.setImageBitmap(bitmap);
else
imageView.setBackgroundDrawable(new BitmapDrawable(bitmap));
}else{
queuePhoto(url,imageView);
if(isSrc)
imageView.setImageResouce(stub_id);
else
imageView.setBackgroundResource(stub_id);
}
}
private void ququePhoto(String url,ImageView imageView){
PhotoToLoad p = new PhotoToLoad(url,imageView);
executoService.submit(new PhotoSLoader(p));
}
private Bitmap getBitmap(String url){
try{
File f = filCache.getFile(url);
// SD卡
Bitmap b = onDecodeFile(f);
if(b != null)
return b;
// 从网络
Bitmap bitmap = null;
Sysytem.out.println("ImageLoader-->download");
HttpUtil.CopyStream(url,f);
bitmap = onDecoderFile(f);
return bitmap;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
public Bitmap onDecodeFile(File f){
try{
return BitmapFactory.decodeStream(new FileInputStream(f));
}catch(FileNotFoundException e){
e.printStackTrace();
}
return null;
}
// 解码图像用来减少内存消耗
public Bitmap decodeFile(File f){
try{
// 解码图像大小
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(new FileInputStream(f),null,o);
// 找到正确的刻度值,它应该是2的幂
final int REQUIRED_SIZE = 70;
int width_tmp = o.outWidth,height_tmp = o.outHeight;
int scale = 1;
while(true){
if(width_tmp/2 < REQUIRED_SIZE || height_tmp/2 < REQUIRED_SIZE)
break;
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
return BitmapFactory.decodeStream(new FileInputStream(f),null,o2);
}catch(FileNotFoundException e){
}
return null;
}
// 任务队列
private class PhotToLoad{
public String url;
public ImageView imageView;
public PhotoToLoad(String u,ImageView i){
url = u;
imageView = i;
}
}
class PhotosLoader implementsRunnable{
PhotoToLoad photoToLoad;
PhotoLoader(PhotoToLoad photoToLoad){
this.photoToLoad = photoToLoad;
}
@Override
public void run(){
if(imageViewReused(photoToLoad))
return;
Bitmap bmp = getBitMap(photoToLoad.url);
memoryCache.put(photoToLoade.url.bmp);
if(imageViewReused(photoToLoade))
return;
BitmapDisplayer bd = new BitmapDisplayer(bmp,photoToLoad);
Activity a = (Activity)photoToLoad.imageView.getContext();
a.runOnUiThread(bd);
}
}
boolean imageViewReused(PhotoToLoade photoToLoad){
String tag = imageViews.get(photoToLoad.imageView);
if(tag == null ||!tag.equals(pgotoToLoad.url))
return true;
return false;
}
// 在UI线程显示位图
class BitmapDisplayer implements Runnable{
Bitmap bitmap;
PhotoToLoad photoToLoad;
public BitmapDisplayer(Bitmap b,PhotoToLoad p){
bitmap = b;
photoToLoad = p;
}
public void run(){
if(imageViewReused(photoToLoad))
return;
if(bitmap != unll){
if(isSrc)
photoToLoad.imageView.setImageResouce(stub_id);
else
photoToLoad.imageView.setBackgroundDrawable(new BitmapDrawable(bitmao));
}else{
if(isSrc)
photoToLoad.imageView.setImageResouce(stub_id);
else
photoToLoad.imageView.setBackgroundDrawable(new BitmapDrawable(bitmao));
}
}
}
public void clearCache(){
memoryCache.clear();
fileCache.clear();
}
}
Android异步加载图片并缓存到本地软引用
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 一、缓存介绍: (一)、Android中缓存的必要性:智能手机的缓存管理应用非常的普遍和需要,是提高用户体验的有效...
- 一、缓存介绍: (一)、Android中缓存的必要性: 智能手机的缓存管理应用非常的普遍和需要,是提高用户体验的有...