import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.LruCache;
import android.widget.ImageView;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* @author Dash
* @date 2017/10/20
* @description:三级缓存
*/
public class ImageHelper {
private LruCache<String, Bitmap> lruCache;
public ImageHelper() {
//分配内存缓存的大小...当前应用可用内存的1/8...每一张图片的大小需要计算...如果总和超过内存大小,使用最近最少使用算法进行删除
int maxMemory = (int) Runtime.getRuntime().maxMemory();
//计算每一张图片的大小
lruCache = new LruCache<String, Bitmap>(maxMemory) {
//计算每一张图片的大小
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight();
}
};
}
/**
* 展示图片用
*/
public void displayImage(ImageView imageView,String path){
//1.获取内存中的图片,,,有,设置显示
Bitmap bitmap = lruCache.get(path);
if (bitmap != null){
imageView.setImageBitmap(bitmap);
return;
}
//2.获取sd卡里面的图片,,,有,设置显示并且放到内存
bitmap = loadFromLocal(path);
if (bitmap != null){
imageView.setImageBitmap(bitmap);
return;
}
//3.获取网络图片,,,存到sd卡,存到内存,显示
loadFromNet(imageView,path);
}
/**
* 网络上获取图片.....存sd卡,,,存到内存中,,,显示
* @param imageView
* @param path
*/
private void loadFromNet(final ImageView imageView, final String path) {
new AsyncTask<Void, Void, Bitmap>() {
@Override
protected Bitmap doInBackground(Void... voids) {
try {
URL url = new URL(path);
try {
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setReadTimeout(5000);
connection.setConnectTimeout(5000);
int responseCode = connection.getResponseCode();
if (responseCode == 200){
InputStream inputStream = connection.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
return bitmap;
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
//存sd卡
saveToLocal(path,bitmap);
//存内存
lruCache.put(path,bitmap);
//显示
imageView.setImageBitmap(bitmap);
}
}.execute();
}
/**
* 存到sd卡中
* @param path 作为文件名来使用
* @param bitmap
*/
private void saveToLocal(String path, Bitmap bitmap) {
File file = new File(getLocalDir(),path.hashCode()+"");//String.valueOf()也能把int值转为字符串
try {
//bitmap药作为文件存到sd卡上需要借助compress方法...压缩
OutputStream outputStream = new FileOutputStream(file);
//第一个参数是以什么图片的格式压缩,第二个参数是压缩比例,100表示不压缩,70表示压缩30%,第三个参数表示通过输出流向外输出
bitmap.compress(Bitmap.CompressFormat.JPEG,100, outputStream);
outputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 从sd卡获取图片
* @param path
* @return
*/
private Bitmap loadFromLocal(String path) {
File file = new File(getLocalDir(),path.hashCode()+"");//这个文件就是图片的文件
if (file.exists()){
//把文件转成bitmap
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
//放到内存中
lruCache.put(path,bitmap);
return bitmap;
}
return null;
}
private File getLocalDir(){
//创建一个存的文件夹
File file = new File(Environment.getExternalStorageDirectory(),"myimage");
if (!file.exists()){
file.mkdirs();
}
return file;
}
}
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.LruCache;
import android.widget.ImageView;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* @author Dash
* @date 2017/10/20
* @description:三级缓存
*/
public class ImageHelper {
private LruCache<String, Bitmap> lruCache;
public ImageHelper() {
//分配内存缓存的大小...当前应用可用内存的1/8...每一张图片的大小需要计算...如果总和超过内存大小,使用最近最少使用算法进行删除
int maxMemory = (int) Runtime.getRuntime().maxMemory();
//计算每一张图片的大小
lruCache = new LruCache<String, Bitmap>(maxMemory) {
//计算每一张图片的大小
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight();
}
};
}
/**
* 展示图片用
*/
public void displayImage(ImageView imageView,String path){
//1.获取内存中的图片,,,有,设置显示
Bitmap bitmap = lruCache.get(path);
if (bitmap != null){
imageView.setImageBitmap(bitmap);
return;
}
//2.获取sd卡里面的图片,,,有,设置显示并且放到内存
bitmap = loadFromLocal(path);
if (bitmap != null){
imageView.setImageBitmap(bitmap);
return;
}
//3.获取网络图片,,,存到sd卡,存到内存,显示
loadFromNet(imageView,path);
}
/**
* 网络上获取图片.....存sd卡,,,存到内存中,,,显示
* @param imageView
* @param path
*/
private void loadFromNet(final ImageView imageView, final String path) {
new AsyncTask<Void, Void, Bitmap>() {
@Override
protected Bitmap doInBackground(Void... voids) {
try {
URL url = new URL(path);
try {
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setReadTimeout(5000);
connection.setConnectTimeout(5000);
int responseCode = connection.getResponseCode();
if (responseCode == 200){
InputStream inputStream = connection.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
return bitmap;
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
//存sd卡
saveToLocal(path,bitmap);
//存内存
lruCache.put(path,bitmap);
//显示
imageView.setImageBitmap(bitmap);
}
}.execute();
}
/**
* 存到sd卡中
* @param path 作为文件名来使用
* @param bitmap
*/
private void saveToLocal(String path, Bitmap bitmap) {
File file = new File(getLocalDir(),path.hashCode()+"");//String.valueOf()也能把int值转为字符串
try {
//bitmap药作为文件存到sd卡上需要借助compress方法...压缩
OutputStream outputStream = new FileOutputStream(file);
//第一个参数是以什么图片的格式压缩,第二个参数是压缩比例,100表示不压缩,70表示压缩30%,第三个参数表示通过输出流向外输出
bitmap.compress(Bitmap.CompressFormat.JPEG,100, outputStream);
outputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 从sd卡获取图片
* @param path
* @return
*/
private Bitmap loadFromLocal(String path) {
File file = new File(getLocalDir(),path.hashCode()+"");//这个文件就是图片的文件
if (file.exists()){
//把文件转成bitmap
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
//放到内存中
lruCache.put(path,bitmap);
return bitmap;
}
return null;
}
private File getLocalDir(){
//创建一个存的文件夹
File file = new File(Environment.getExternalStorageDirectory(),"myimage");
if (!file.exists()){
file.mkdirs();
}
return file;
}
}