圖片下載之緩存

public class MainActivity extends Activity {

	static ImageView iv;
	static MainActivity ma;
	static Handler handler = new Handler(){
		//此方法在主線程中調用,可以用來刷新ui
		public void handleMessage(android.os.Message msg) {
			//處理消息時,需要知道到底是成功的消息,還是失敗的消息
			switch (msg.what) {
			case 1:
				//把位圖對象顯示至imageview
				iv.setImageBitmap((Bitmap)msg.obj);
				break;

			case 0:
				Toast.makeText(ma, "請求失敗", 0).show();
				break;
			}
			
		}
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		iv = (ImageView) findViewById(R.id.iv);
		ma = this;
	}

	public void click(View v){
		//下載圖片
		//1.確定網址
		final String path = "http://192.168.13.13:8080/dd.jpg";
		final File file = new File(getCacheDir(), getFileName(path));
		//判斷,緩存中是否存在該文件
		if(file.exists()){
			//如果緩存存在,從緩存讀取圖片
			System.out.println("從緩存讀取的");
			Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath());
			iv.setImageBitmap(bm);
		}
		else{
			//如果緩存不存在,從網絡下載
			System.out.println("從網上下載的");
			Thread t = new Thread(){
				@Override
				public void run() {
					
					try {
						//2.把網址封裝成一個url對象
						URL url = new URL(path);
						//3.獲取客戶端和服務器的連接對象,此時還沒有建立連接
						HttpURLConnection conn = (HttpURLConnection) url.openConnection();
						//4.對連接對象進行初始化
						//設置請求方法,注意大寫
						conn.setRequestMethod("GET");
						//設置連接超時
						conn.setConnectTimeout(5000);
						//設置讀取超時
						conn.setReadTimeout(5000);
						//5.發送請求,與服務器建立連接
						conn.connect();
						//如果響應碼爲200,說明請求成功
						if(conn.getResponseCode() == 200){
							//獲取服務器響應頭中的流,流裏的數據就是客戶端請求的數據
							InputStream is = conn.getInputStream();
							
							//讀取服務器返回的流裏的數據,把數據寫到本地文件,緩存起來
							
							FileOutputStream fos = new FileOutputStream(file);
							byte[] b = new byte[1024];
							int len = 0;
							while((len = is.read(b)) != -1){
								fos.write(b, 0, len);
							}
							fos.close();
							
							//讀取出流裏的數據,並構造成位圖對象
							//流裏已經沒有數據了
//							Bitmap bm = BitmapFactory.decodeStream(is);
							Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath());
							
							
							Message msg = new Message();
							//消息對象可以攜帶數據
							msg.obj = bm;
							msg.what = 1;
							//把消息發送至主線程的消息隊列
							handler.sendMessage(msg);
							
						}
						else{
//							Toast.makeText(MainActivity.this, "請求失敗", 0).show();
							
							Message msg = handler.obtainMessage();
							msg.what = 0;
							handler.sendMessage(msg);
						}
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			};
			t.start();
		}
		
		
	}
	
	public String getFileName(String path){
		int index = path.lastIndexOf("/");
		return path.substring(index + 1);
	}

}

發佈了51 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章