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);
}
}
圖片下載之緩存
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.