图片查看器---本地图片缓存

<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>

你可能感兴趣的:(图片查看器---本地图片缓存)