Android 從網絡下載圖片OOM

最近有個需求,從網絡下載圖片,但不能使用imageloader,因爲iimageloader使用緩存機制,同一路徑下的圖片如果跟換怎不會刷新替換。所以必須自己下載解析。但遇到OOM的問題,如果用BitmapFactory.decodeStream 則會返回null,所以我採用的辦法是先將圖片下載下來,再計算圖片寬高,最後綁定圖片後將圖片刪除的辦法。話不多說,先上代碼

//path爲圖片的網絡路徑

private Bitmap getHttpBitmap(String path) {
try {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
if (conn.getResponseCode() == 200) {
InputStream is = conn.getInputStream();
//獲取圖片路徑
String[] names = path.split("/");
String name = names[names.length-1];
//保存圖片到本地
FileOutputStream outStream = new FileOutputStream(new File(Environment.getExternalStorageDirectory() + "/"+ name));
byte[] buffer = new byte[1024];
int len = -1;
while ((len = is.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
outStream.close();

//獲取圖片寬高
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;
BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/"+ name , opts);
int imageWidth = opts.outWidth;
int imageHeight = opts.outHeight;
Log.i("imageWidth", String.valueOf(imageWidth));
Log.i("imageHeight", String.valueOf(imageHeight));
//計算縮放比例,此處100爲默認值,也可以獲取控件寬高進行計算
int widthscale = imageWidth / 100;
int heightscale = imageHeight / 100;
int scale = widthscale > heightscale ? widthscale
: heightscale;
Log.i("scale", String.valueOf(scale));
//開始真正獲取圖片,進行壓縮後的圖片
opts.inJustDecodeBounds = false;
opts.inSampleSize = scale;
localerweima =Environment.getExternalStorageDirectory() + "/"+ name;
Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/"+ name , opts);
Log.i("bitmap1", String.valueOf(bitmap));
is.close();
Message msg = Message.obtain();
msg.what = 1;
msg.obj = bitmap;
handler.sendMessage(msg);
return bitmap;
}
return null;
} catch (Exception e) {
Log.i("e.toString();", e.toString());
return null;
}
}



//這是handler綁定圖片並刪除文件的操作

Message msg = new Message();
Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1: // 二維碼
Bitmap bm = (Bitmap) msg.obj;
tv_erweima.setImageBitmap(bm);
new File(localerweima).delete();  //每次綁定完成後刪除本地文件
break;
default:
break;
}
};
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章