三级缓存

来源:互联网 发布:淘宝网账号注册 编辑:程序博客网 时间:2024/06/09 13:46
public class MainActivity extends Activity {private FileCache fileCache;private LruCache<String, Bitmap> memoryCache;public void copyStream(InputStream is, OutputStream os) {final int buffer_size = 1024;try {byte[] bytes = new byte[buffer_size];int count = 0;while ((count = is.read(bytes, 0, buffer_size)) != -1) {os.write(bytes, 0, count);}} catch (IOException e) {e.printStackTrace();}}private Bitmap getBitmap(String url) {File f = fileCache.getFile(url);// from SD cacheBitmap b = decodeFile(f);if (b != null) {memoryCache.put(url, b);return b;}// from webtry {Bitmap bitmap = null;URL imageUrl = new URL(url);HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();conn.setConnectTimeout(30000);conn.setReadTimeout(30000);conn.setInstanceFollowRedirects(true);InputStream is = conn.getInputStream();OutputStream os = new FileOutputStream(f);copyStream(is, os);// 存到文件os.close();conn.disconnect();bitmap = decodeFile(f);memoryCache.put(url, bitmap);return bitmap;} catch (Throwable ex) {ex.printStackTrace();if (ex instanceof OutOfMemoryError)memoryCache.evictAll();return null;}}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);fileCache = new FileCache(this);memoryCache = new LruCache<String, Bitmap>((int) (Runtime.getRuntime().maxMemory() / 4)) {@Overrideprotected int sizeOf(String key, Bitmap bitmap) {return bitmap.getByteCount();}};new MyAsync() {private Bitmap bitmap;@Overrideprotected void onPostExecute(Void result) {ImageView iv = (ImageView) findViewById(R.id.imageView1);iv.setImageBitmap(bitmap);super.onPostExecute(result);}@Overrideprotected Void doInBackground(Void... params) {bitmap = getBitmap("http://img.my.csdn.net/uploads/201308/31/1377949577_1998.jpg");return null;}}.execute();}abstract class MyAsync extends AsyncTask<Void, Void, Void> {@Overrideprotected abstract Void doInBackground(Void... params);}private Bitmap decodeFile(File f) {BitmapFactory.Options o = new BitmapFactory.Options();o.inJustDecodeBounds = true;BitmapFactory.decodeFile(f.getPath(), o);final int REQUIRED_SIZE = 70;int width_tmp = o.outWidth, height_tmp = o.outHeight;int scale = 1;while (true) {if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE)break;width_tmp /= 2;height_tmp /= 2;scale *= 2;}// int outHeight = o.outHeight;// int outWidth = o.outWidth;// WindowManager wm = getWindowManager();// int screenHeight = wm.getDefaultDisplay().getHeight();// int screenWidth = wm.getDefaultDisplay().getWidth();// int scale = 1;// int scaleX = outWidth / screenWidth;// int scaleY = outHeight / screenHeight;// if (scaleX >= scaleY && scaleY >= 1) {// // 按照水平方向缩放// scale = scaleX;// }// if (scaleY >= scaleX && scaleX >= 1) {// // 按照垂直方向缩放// scale = scaleY;// }o.inJustDecodeBounds = false;o.inSampleSize = scale;Bitmap bitmap = BitmapFactory.decodeFile(f.getPath(), o);return bitmap;}class FileCache {private File cacheDir;public FileCache(Context context) {// Find the dir to save cached imagesif (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))cacheDir = cacheDir = new File(android.os.Environment.getExternalStorageDirectory(),"LazyList");elsecacheDir = context.getCacheDir();if (!cacheDir.exists())cacheDir.mkdirs();}public File getFile(String url) {String filename = String.valueOf(url.hashCode());File f = new File(cacheDir, filename);return f;}public void clear() {File[] files = cacheDir.listFiles();if (files == null)return;for (File f : files)f.delete();}}}


0 0
原创粉丝点击