<span style="font-size:18px;">package com.tz.melody;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.RequiresPermission.Write;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button bt;
private ImageView iv;
Handler handler = new Handler(){
//只要消息队列有消息,此方法就会在主线程执行
//重写handleMessage 来刷新UI
public void handleMessage(android.os.Message msg) {
//判断消息是成功或者失败
switch (msg.what) {
case 1:
//把下载的图片显示在img控件
iv = (ImageView) findViewById(R.id.iv);
iv.setImageBitmap((Bitmap) msg.obj); //msg就是obj
break;
case 2:
Toast.makeText(MainActivity.this, "请求失败", 0).show();
break;
}
}
};
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View v){
final String path = "http://192.168.1.106/dd.jpg";
//定义一个写入到cache里面的文件 arg0:文件路径 arg1:文件名
final File file = new File(getCacheDir(),getNameFromPath(path));
if(file.exists()){
System.out.println("从缓存获取");
//指定一个本地路径,把缓存的图片构造成一个位图
Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath());
//发消息给主线程刷新UI
Message msg = new Message();
msg.obj = bm;
msg.what = 1;
handler.sendMessage(msg);
//或者直接显示
// iv = (ImageView) findViewById(R.id.iv);
// iv.setImageBitmap((Bitmap) msg.obj);
}else{
System.out.println("从网络请求");
//开启子线程 加载图片。主线程不能进行操作,因为会卡死
Thread t = new Thread(){
public void run() {
//发送http请求
try {
//1.创建URL对象,使用网址构造一个URL请求
URL url = new URL(path);
//2.获取连接对象,为了设置属性
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//3.设置一些属性
//设置请求方式,注意大写
conn.setRequestMethod("GET");
//设置请求超时时间
conn.setReadTimeout(8000);
//设置读取超时
conn.setReadTimeout(8000);
//4.发送请求建立链接 可以不写,因为在GET提交时可以提交
//conn.connect();
//5.判断请求码是否成功 请求码200表示成功 6.添加internet
if(conn.getResponseCode() == 200){
//获取服务器返回的输入流,流里就是客户端请求的数据
InputStream is = conn.getInputStream();
//我们自己读取流里的数据,读取1K就把1K写到本地文件缓存起来
byte[] b = new byte[1024]; //定义一个1字节的数组
int len;
FileOutputStream fos = new FileOutputStream(file);
//流里的数据,读取1K就把1K写到本地文件缓存起来
while ((len = is.read(b)) != -1) {
fos.write(b,0,len);
}
fos.close();
//读取流里的数据,构造出一张图片(这个方法要确定流里就是一张图片才可以用 )
//缓存时已经把流里数据读取完了,此时流里没有任何数据
//Bitmap bm = BitmapFactory.decodeStream(is);
//指定一个本地路径,把缓存的图片构造成一个位图
Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath());
//当子线程需要刷新UI时,只需要发送一条消息至消息队列
Message msg = new Message();
//消息对象本身是可以携带数据的
msg.obj = bm;
//标注请求成功或者失败
msg.what = 1;
handler.sendMessage(msg);
}else{
//如果你的消息不携带数据,可以发送空消息,如果携带,就必须创建消息
//handler.sendMessage(what);
//如果消息池有消息,取出消息池第一条消息,返回,如果没有就new一个消息返回
// Message msg = handler.obtainMessage();
// //标注请求成功或者失败
// msg.what = 2;
// handler.sendMessage(msg);
//简单写法
handler.sendEmptyMessage(2);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
};
t.start();
}
}
//定义一个方法截取字符串
public String getNameFromPath(String path){
int index = path.lastIndexOf("/");
return path.substring(index + 1);
}
}
</span>
图片查看器---本地图片缓存
最新推荐文章于 2022-06-27 15:38:23 发布