标签:
/*** SharePreference封装**/public class PrefUtils {public static final String PREF_NAME = "config";public static boolean getBoolean(Context ctx, String key,boolean defaultValue) {SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME,Context.MODE_PRIVATE);return sp.getBoolean(key, defaultValue);}public static void setBoolean(Context ctx, String key, boolean value) {SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME,Context.MODE_PRIVATE);sp.edit().putBoolean(key, value).commit();}public static String getString(Context ctx, String key, String defaultValue) {SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME,Context.MODE_PRIVATE);return sp.getString(key, defaultValue);}public static void setString(Context ctx, String key, String value) {SharedPreferences sp = ctx.getSharedPreferences(PREF_NAME,Context.MODE_PRIVATE);sp.edit().putString(key, value).commit();}}
public class CacheUtils {/*** 缓存原理:设置缓存 key 是url, value是json(解析出来的)*/public static void setCache(String key, String value, Context ctx) {PrefUtils.setString(ctx, key, value);// 可以将缓存放在文件中, 文件名就是Md5(url), 文件内容是json}/*** 获取缓存 key 是url*/public static String getCache(String key, Context ctx) {return PrefUtils.getString(ctx, key, null);}}
private void getDataFromServer() {HttpUtils utils = new HttpUtils();utils.send(HttpMethod.GET, GlobalContants.PHOTOS_URL,new RequestCallBack<String>() {@Overridepublic void onSuccess(ResponseInfo<String> responseInfo) {String result = (String) responseInfo.result;parseData(result);// 设置缓存CacheUtils.setCache(GlobalContants.PHOTOS_URL, result,mActivity);}@Overridepublic void onFailure(HttpException error, String msg) {Toast.makeText(mActivity, msg, Toast.LENGTH_SHORT).show();error.printStackTrace();}});}
public void initData() {String cache = CacheUtils.getCache(GlobalContants.PHOTOS_URL, mActivity);if (!TextUtils.isEmpty(cache)) {- // parseData(cache);
}getDataFromServer();}
protected void parseData(String result) {Gson gson = new Gson();PhotosData data = gson.fromJson(result, PhotosData.class);mPhotoList = data.data.news;// 获取组图列表集合if (mPhotoList != null) {mAdapter = new PhotoAdapter();lvPhoto.setAdapter(mAdapter);gvPhoto.setAdapter(mAdapter);}}

public class MyBitmapUtils {NetCacheUtils mNetCacheUtils;LocalCacheUtils mLocalCacheUtils;MemoryCacheUtils mMemoryCacheUtils;public MyBitmapUtils() {mMemoryCacheUtils = new MemoryCacheUtils();mLocalCacheUtils = new LocalCacheUtils();mNetCacheUtils = new NetCacheUtils(mLocalCacheUtils, mMemoryCacheUtils);}public void display(ImageView ivPic, String url) {ivPic.setImageResource(R.drawable.news_pic_default);// 设置默认加载图片Bitmap bitmap = null;// 从内存读bitmap = mMemoryCacheUtils.getBitmapFromMemory(url);if (bitmap != null) {ivPic.setImageBitmap(bitmap);System.out.println("从内存读取图片啦...");return;}// 从本地读bitmap = mLocalCacheUtils.getBitmapFromLocal(url);if (bitmap != null) {ivPic.setImageBitmap(bitmap);System.out.println("从本地读取图片啦...");mMemoryCacheUtils.setBitmapToMemory(url, bitmap);// 将图片保存在内存return;}// 从网络读mNetCacheUtils.getBitmapFromNet(ivPic, url);}}
public class NetCacheUtils {private LocalCacheUtils mLocalCacheUtils;private MemoryCacheUtils mMemoryCacheUtils;public NetCacheUtils(LocalCacheUtils localCacheUtils,MemoryCacheUtils memoryCacheUtils) {mLocalCacheUtils = localCacheUtils;mMemoryCacheUtils = memoryCacheUtils;}/*** 从网络下载图片** @param ivPic* @param url*/public void getBitmapFromNet(ImageView ivPic, String url) {new BitmapTask().execute(ivPic, url);// 启动AsyncTask,// 参数会在doInbackground中获取}/*** Handler和线程池的封装** 第一个泛型: 参数类型 第二个泛型: 更新进度的泛型, 第三个泛型是onPostExecute的返回结果** @author Kevin**/class BitmapTask extends AsyncTask<Object, Void, Bitmap> {private ImageView ivPic;private String url;/*** 后台耗时方法在此执行, 子线程*/@Overrideprotected Bitmap doInBackground(Object... params) {ivPic = (ImageView) params[0];url = (String) params[1];ivPic.setTag(url);// 将url和imageview绑定return downloadBitmap(url);}/*** 更新进度, 主线程*/@Overrideprotected void onProgressUpdate(Void... values) {super.onProgressUpdate(values);}/*** 耗时方法结束后,执行该方法, 主线程*/@Overrideprotected void onPostExecute(Bitmap result) {if (result != null) {String bindUrl = (String) ivPic.getTag();if (url.equals(bindUrl)) {// 确保图片设定给了正确的imageviewivPic.setImageBitmap(result);mLocalCacheUtils.setBitmapToLocal(url, result);// 将图片保存在本地mMemoryCacheUtils.setBitmapToMemory(url, result);// 将图片保存在内存System.out.println("从网络缓存读取图片啦...");}}}}/*** 下载图片** @param url* @return*/private Bitmap downloadBitmap(String url) {HttpURLConnection conn = null;try {conn = (HttpURLConnection) new URL(url).openConnection();conn.setConnectTimeout(5000);conn.setReadTimeout(5000);conn.setRequestMethod("GET");conn.connect();int responseCode = conn.getResponseCode();if (responseCode == 200) {InputStream inputStream = conn.getInputStream();//图片压缩处理BitmapFactory.Options option = new BitmapFactory.Options();option.inSampleSize = 2;//宽高都压缩为原来的二分之一, 此参数需要根据图片要展示的大小来确定option.inPreferredConfig = Bitmap.Config.RGB_565;//设置图片格式Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, option);return bitmap;}} catch (Exception e) {e.printStackTrace();} finally {conn.disconnect();}return null;}}
public class LocalCacheUtils {public static final String CACHE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/zhbj_cache_52";/*** 从本地sdcard读图片*/public Bitmap getBitmapFromLocal(String url) {try {String fileName = MD5Encoder.encode(url);File file = new File(CACHE_PATH, fileName);if (file.exists()) {Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(file));//decodeStream放的是输入输出流return bitmap;}} catch (Exception e) {e.printStackTrace();}return null;}/*** 向sdcard写图片** @param url* @param bitmap*/public void setBitmapToLocal(String url, Bitmap bitmap) {try {String fileName = MD5Encoder.encode(url);File file = new File(CACHE_PATH, fileName);File parentFile = file.getParentFile();if (!parentFile.exists()) {// 如果文件夹不存在, 创建文件夹parentFile.mkdirs();}// 将图片保存在本地bitmap.compress(CompressFormat.JPEG, 100,new FileOutputStream(file));//100是质量} catch (Exception e) {e.printStackTrace();}}}
public class MemoryCacheUtils {// private HashMap<String, SoftReference<Bitmap>> mMemoryCache = new// HashMap<String, SoftReference<Bitmap>>();//一开始使用map,后来使用软引用private LruCache<String, Bitmap> mMemoryCache;public MemoryCacheUtils() {long maxMemory = Runtime.getRuntime().maxMemory() / 8;//主流都是分配16m的8/1mMemoryCache = new LruCache<String, Bitmap>((int) maxMemory) {@Overrideprotected int sizeOf(String key, Bitmap value) {int byteCount = value.getRowBytes() * value.getHeight();// 获取图片占用内存大小return byteCount;}};}/*** 从内存读** @param url*/public Bitmap getBitmapFromMemory(String url) {// SoftReference<Bitmap> softReference = mMemoryCache.get(url);// if (softReference != null) {// Bitmap bitmap = softReference.get();// return bitmap;// }return mMemoryCache.get(url);}/*** 写内存** @param url* @param bitmap*/public void setBitmapToMemory(String url, Bitmap bitmap) {// SoftReference<Bitmap> softReference = new// SoftReference<Bitmap>(bitmap);// mMemoryCache.put(url, softReference);mMemoryCache.put(url, bitmap);}}
标签:
原文地址:http://www.cnblogs.com/liuyu0529/p/4919332.html