package com.kuangye.helper;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.LinkedHashMap;
import java.util.Map;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Environment;
import android.os.StatFs;
import android.util.LruCache;
import android.widget.ImageView;
public class ImageDownloadHelper {
public final String TAG = "ImageDownloaderHelper";
// public HashMap<String, MyAsyncTask> map = new HashMap<String,
// MyAsyncTask>();
public Map<String, SoftReference<Bitmap>> softCaches = new LinkedHashMap<String, SoftReference<Bitmap>>();
public LruCache<String, Bitmap> lruCache = null;
public interface OnImageDownloadListener {
void onImageDownload(Bitmap bitmap, String imgUrl);
}
public ImageDownloadHelper() {
int memoryAmount = (int) Runtime.getRuntime().maxMemory();
// 鑾峰彇鍓╀綑鍐呭瓨鐨?鍒嗕箣涓?綔涓虹紦瀛?
int cacheSize = memoryAmount / 8;
if (lruCache == null) {
lruCache = new MyLruCache(cacheSize);
}
}
// 寮傛鍔犺浇鍥剧墖鏂规硶
public void myDownloadImage(Context context, String url,
ImageView imageView, OnImageDownloadListener downloadListener) {
Bitmap bitmap = null;
// 鍏堜粠寮哄紩鐢ㄤ腑鎷挎暟鎹?
if (lruCache != null) {
bitmap = lruCache.get(url);
}
if (bitmap != null && url.equals(imageView.getTag())) {
// Log.i(TAG, "==浠庡己寮曠敤涓壘鍒版暟鎹? + bitmap.toString());
imageView.setImageBitmap(bitmap);
} else {
SoftReference<Bitmap> softReference = softCaches.get(url);
if (softReference != null) {
bitmap = softReference.get();
}
// 浠庤蒋寮曠敤涓嬁鏁版嵁
if (bitmap != null && url.equals(imageView.getTag())) {
// Log.i(TAG, "==浠庤蒋寮曠敤涓壘鍒版暟鎹? + bitmap.toString());
imageView.setImageBitmap(bitmap);
// 娣诲姞鍒板己寮曠敤涓?
lruCache.put(url, bitmap);
// 浠庤蒋寮曠敤闆嗗悎涓Щ闄?
softCaches.remove(url);
} else {
// 浠庢枃浠剁紦瀛樹腑鎷挎暟鎹?
if (url != null) {
String imageName = "";
imageName = getImageName(url);
String cachePath = ImageDownloadHelper.SDCardHelper
.getInstance().getSDCardCachePath(context);
bitmap = ImageDownloadHelper.SDCardHelper.getInstance()
.loadBitmapFromSDCard(
cachePath + File.separator + imageName);
if (bitmap != null && url.equals(imageView.getTag())) {
// Log.i(TAG, "==浠庢枃浠剁紦瀛樹腑鎵惧埌鏁版嵁" + bitmap.toString());
imageView.setImageBitmap(bitmap);
// 鏀惧叆寮虹紦瀛?
lruCache.put(url, bitmap);
} else {
// 浠庣綉缁滀腑鎷挎暟鎹?
// if (url != null && needCreateNewTask(imageView)) {
// MyAsyncTask task = new MyAsyncTask(context, url,
// imageView, downloadListener);
// if (imageView != null) {
// task.execute(url);
// // 灏嗗搴旂殑url瀵瑰簲鐨勪换鍔″瓨璧锋潵
// map.put(url, task);
// }
// }
new MyAsyncTask(context, url, imageView,
downloadListener).execute(url);
}
}
}
}
}
/*
* // 鍒ゆ柇鏄惁闇?閲嶆柊鍒涘缓绾跨▼涓嬭浇鍥剧墖锛屽鏋滈渶瑕侊紝杩斿洖鍊间负true public boolean
* needCreateNewTask(ImageView imageView) { boolean flag = true; if
* (imageView != null) { String currentTaskUrl = (String)
* imageView.getTag(); if (isTaskCreated(currentTaskUrl)) { flag = false; }
* } return flag; }
*
* // 妫?煡璇rl鎵?搴旂殑浠诲姟鏄惁琚垱寤鸿繃锛堟渶缁堝弽鏄犵殑鏄綋鍓嶇殑ImageView鐨則ag锛宼ag浼氭牴鎹畃osition鐨勪笉鍚岃?涓嶅悓锛?public
* boolean isTaskCreated(String url) { boolean flag = false; if (map != null
* && map.get(url) != null) { flag = true; } return flag; }
*
* // 鍒犻櫎map涓url瀵瑰簲鐨勪换鍔′俊鎭紝杩欎竴姝ュ緢閲嶈锛屼笉鐒禡yAsyncTask鐨勫紩鐢ㄤ細鈥滀竴鐩粹?瀛樺湪浜巑ap涓紝鑰屾棤娉曞啀娆℃墽琛岃浠诲姟
* public void removeTaskFromMap(String url) { if (url != null && map !=
* null && map.get(url) != null) { map.remove(url); } }
*/
// 寮傛浠诲姟绫?
class MyAsyncTask extends AsyncTask<String, Void, Bitmap> {
public Context context;
public ImageView mImageView;
public String url;
public OnImageDownloadListener downloadListener;
public MyAsyncTask(Context context, String url, ImageView mImageView,
OnImageDownloadListener downloadListener) {
this.context = context;
this.url = url;
this.mImageView = mImageView;
this.downloadListener = downloadListener;
}
@Override
protected Bitmap doInBackground(String... params) {
Bitmap bm = null;
try {
String urlString = params[0];
URL urlObj = new URL(urlString);
HttpURLConnection httpConn = (HttpURLConnection) urlObj
.openConnection();
httpConn.setDoInput(true);
httpConn.setRequestMethod("GET");
httpConn.connect();
if (httpConn.getResponseCode() == 200) {
InputStream is = httpConn.getInputStream();
bm = BitmapFactory.decodeStream(is);
}
if (bm != null) {
String imageName = getImageName(urlString);
boolean flag = ImageDownloadHelper.SDCardHelper
.getInstance().saveBitmapToSDCardPrivateCacheDir(
bm, imageName, context);
if (flag) {
// Log.i(TAG, "==浠庣綉缁滀腑鎵惧埌鏁版嵁" + bm.toString());
// 鏀惧叆寮虹紦瀛?
lruCache.put(urlString, bm);
} else {
// removeTaskFromMap(urlString);
}
return bm;
} else {
// removeTaskFromMap(urlString);
}
} catch (Exception e) {
e.printStackTrace();
// removeTaskFromMap(urlString);
}
return null;
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
// 鍥炶皟璁剧疆鍥剧墖
if (downloadListener != null && result != null) {
downloadListener.onImageDownload(result, url);
// 璇rl瀵瑰簲鐨則ask宸茬粡涓嬭浇瀹屾垚锛屼粠map涓皢鍏跺垹闄?
// removeTaskFromMap(url);
}
}
}
// 寮哄紩鐢ㄧ紦瀛樼被
class MyLruCache extends LruCache<String, Bitmap> {
public MyLruCache(int maxSize) {
super(maxSize);
}
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getHeight() * value.getWidth() * 4;
// Bitmap鍥剧墖鐨勪竴涓儚绱犳槸4涓瓧鑺?
// return value.getRowBytes() * value.getHeight();
}
@Override
protected void entryRemoved(boolean evicted, String key,
Bitmap oldValue, Bitmap newValue) {
if (evicted) {
SoftReference<Bitmap> softReference = new SoftReference<Bitmap>(
oldValue);
softCaches.put(key, softReference);
}
}
}
// SDCard宸ュ叿绫?
static class SDCardHelper {
public static SDCardHelper sdCardHelper;
public static SDCardHelper getInstance() {
if (sdCardHelper == null) {
sdCardHelper = new SDCardHelper();
}
return sdCardHelper;
}
// 鍒ゆ柇SDCard鏄惁鎸傝浇
public boolean isSDCardMounted() {
return Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED);
}
// 鑾峰彇SDCard鐨勬牴鐩綍璺緞
public String getSDCardBasePath() {
if (isSDCardMounted()) {
return Environment.getExternalStorageDirectory()
.getAbsolutePath();
} else {
return null;
}
}
// 鑾峰彇SDCard鐨勫畬鏁寸┖闂村ぇ灏?
public long getSDCardTotalSize() {
long size = 0;
if (isSDCardMounted()) {
StatFs statFs = new StatFs(getSDCardBasePath());
// if (Build.VERSION.SDK_INT >= 18) {
// size = statFs.getTotalBytes();
// } else {
// size = statFs.getBlockCount() * s
Android常用工具类
需积分: 5 46 浏览量
2017-08-09
15:08:37
上传
评论
收藏 38KB ZIP 举报
smile_邝野
- 粉丝: 35
- 资源: 5
最新资源
- sony 索尼IMX334摄像头模组电路板AD版硬件PCB图(6层板).zip
- 基于flask和echarts融合交易策略的bitfinex可视化微服务.zip
- 包含了wvp-assist.tar wvp-talk.tar zlmediakit.tar .
- 3r4efgh53wgrf43tw
- 2024新版Java基础从入门到精通全套视频+资料下载
- Spring AI大模型视频教程+ChatGPT视频教程+OpenAI大模型视频教程(资料+视频教程)
- ABB工业机器人教程PDF版本
- 123321123323211
- yolov8实战第八天-pyqt5-yolov8实现车牌识别系统(论文(8700+字+数据集+完整部署代码+代码使用说明)
- 三相桥式全桥整流电路MATALB Simulink仿真文件
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈