图片的三级缓存
程序员文章站
2022-07-02 09:46:12
...
private ImageView mPic_iv;
private File file;
private static final int SUCCESS = 382;
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SUCCESS:
mPic_iv.setImageBitmap((Bitmap)msg.obj);
break ;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPic_iv = (ImageView) findViewById(R.id.pic_iv);
}
/**
* 通过点击事件,从文件中找图片加载,文件没有图片,从网络上找图片
*
* @param view
*/
public void click(View view) {
final String spec = "";
/**
* SD卡的存储空间分为两种类型
* 1.内部存储:文件权限:默认是私有的,不允许别的应用程序访问
* 2.文件存储:应用程序可以把数据存到自己应用的文件夹里面 路径/data/data/包名/文件名,数据安全
* 上下文.getFileDir() ------>/data/data/包名/files/文件名 保存重要的配置信息
* 上下文.getCacheDir() ------>/data/data/包名/cache/文件名 缓存目录
*/
final File file = new File(getCacheDir(), getFileName(spec));
boolean exists = file.exists();
//判断图片在缓存中是否存在,如果存在,那么从缓存中读取
if (exists) {
// 可以从本地中找到图片进行加载
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
mPic_iv.setImageBitmap(bitmap);
} else {//如果图片在缓存中不存在,那么我们从网络上下载,耗时操作,子线程
new Thread(){
public void run() {
try {
//1.使用网址创建一个URL对象
URL url = new URL(spec);
//2.创建HTTPURLConnection对象
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
//3.设置对象请求方式
httpURLConnection.setRequestMethod("GET");
//4.设置连接超时时间
httpURLConnection.setConnectTimeout(8000);
//设置读取的超时时间,写入超时间
//发送请求建立连接
httpURLConnection.connect();
//获取状态码
int responseCode = httpURLConnection.getResponseCode();
if (responseCode == 200){
//拿到服务器返回的数据
InputStream inputStream = httpURLConnection.getInputStream();
//字节数组
byte[] bytes = new byte[1024];
//定义一个int变量
int length;
//把流变成我们的一个文件
FileOutputStream fileOutputStream = new FileOutputStream(file);
while ( (length =inputStream.read(bytes)) !=-1 ){
//输出流进行写入
fileOutputStream.write(bytes,0,length);
}
//关流
fileOutputStream.close();
//可以从本地中找到图片进行加载
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
Message message = new Message();
message.obj =bitmap;
message.what=SUCCESS;
handler.sendMessage(message);
}else {
}
} catch (Exception e) {
e.printStackTrace();
}
};
}.start();
}
}
/**
* http://169.254.53.96:8080/c.jpg
* 从网址的字符串里拿到需要的文件名
*
* @param spec
* @return
*/
private String getFileName(String spec) {
//找到"/"所在字符串的位置
int i = spec.lastIndexOf("/");
System.out.println(i + "");
String s = spec.substring(i + 1);
return s;
}
上一篇: 变量的解构赋值(对象)
下一篇: 三级缓存图片类