Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android簡易實戰教程--第二十六話《網絡圖片查看器在本地緩存》

Android簡易實戰教程--第二十六話《網絡圖片查看器在本地緩存》

編輯:關於Android編程

上一篇已經把王略中的圖片獲取到了。生活中有這麼些場景:微信聯網打開別人照片後,當手機斷網的時候再去點擊人家的額圖片還能完整看到。這時候,已經不是去網路中獲取圖片了,其實微信在獲取網絡圖片同時把圖片在本地做咯額個緩存,這也是微信生成垃圾文件最多的原因之一。

本篇雖然以最簡單直接的方式去對圖片做緩存,但是,其實本質都差不多的。因為上一篇已經介紹的很詳細了(讀者可以去閱讀),這一篇增加一點點功能就好了。代碼如下:

package com.itydl.imageviewer;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import com.ithiema.cacheimageviewer.R;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {

	static ImageView iv;
	static MainActivity ma;
	static Handler handler = new Handler(){
		
		public void handleMessage(android.os.Message msg) {
			
			switch (msg.what) {
			case 1:
				
				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){
		
		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 {
						
						URL url = new URL(path);
						
						HttpURLConnection conn = (HttpURLConnection) url.openConnection();
						
						conn.setRequestMethod("GET");
						
						conn.setConnectTimeout(5000);
						
						conn.setReadTimeout(5000);
						
						conn.connect();
						
						if(conn.getResponseCode() == 200){
							//獲取服務器響應頭中的流,流裡的數據就是客戶端請求的數據
							InputStream is = conn.getInputStream();
							
							//讀取服務器返回的流裡的數據,把數據寫到本地文件,緩存起來
							
							FileOutputStream fos = new FileOutputStream(file);
							byte[] b = new byte[10240];
							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);
	}

}

可以看到,首先是去本地緩存文件中獲取圖片信息的,如果獲取不到,就去訪問網絡圖片。只要一次訪問網絡成功,就會在本地獲取到。除非做了清理。那麼斷網之後,再來運行一下效果看看吧:

 

\

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved