接上,进一步优化,LruCache缓存
生活随笔
收集整理的這篇文章主要介紹了
接上,进一步优化,LruCache缓存
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為了節省流量,提高應用的流暢性,采用Lru算法
Lru(Least Recently Used)近期最少使用算法
Android提供了LruCache類來實現這個緩存算法,典型的以內存換效率的辦法
最終優化完的完整的ImageLoader類的代碼為:
public class ImageLoader{private ImageView mImageView;private Handler mHandler = new Handler();private String mUrl;private LruCache<String, Bitmap> mCaches;//創建Cachepublic ImageLoader(){int maxMemory = (int)Runtime.getRuntime().maxMemory();//獲取最大的可用內存int cacheSize = maxMemory/4;mCaches = new LruCache<>(cacheSize){protected int sizeOf(String key, Bitmap value){return value.getByteCount();//在每次存入緩存的時候調用}};}public void addBitmapToCache(String url, Bitmap bitmap){//增加到緩存if(getBitmapFromCache(url) == null){mCaches.put(url, bitmap);}}public Bitmap getBitmapFromCache(String url){//從緩存中獲取數據return mCaches.get(url);}private Handler handler = new Handler(){public void handleMessage(Message msg){super.handleMessage(msg);if(mImageView.getTag().equals(mUrl))mImageView.setImageBitmap((Bitmap)msg.obj);}}public void showImageByThread(ImageView imageView, String url){mImageView = imageView;mUrl = url;new Thread(){public void run(){super.run();Bitmap bitmao = getBitmapFromURL(url);Message message = Message.obtain();message.obj = bitmap;mHandler.sendMessage(message);}}.start();}public Bitmap getBitmapFromURL(String urlStirng){Bitmap bitmap;InputStream is;try{URL url = new URL(urlStirng);HttpURLConnection connection = (HttpURLConnection)url.openConnection();is = new BufferedInputStream(connection.getInputStream());bitmap = BitmapFactory.decodeStream(is);connection.disconnect();return bitmap;}catch(java.io.IOException e){e.printStackTrace();}finally{is.close();}return null;} }public void showImageByAsyncTask(ImageView imageView, String url){//從緩存中取出對應的圖片,若緩存中沒有,則去網絡下載Bitmap bitmap = getBitmapFromCache(url);if(bitmap == null){new MyAsyncTask(imageView, url).execute(url);}else{//緩存中有圖片,則直接使用imageView.setImageBitmap(bitmap);}}private class MyAsyncTask extends AsyncTask<String, Void, Bitmap>{private ImageView imageView;private String mUrl;public MyAsyncTask(ImageView imageView, String url){mImageView = imageView;mUrl = url;}protected Bitmap doInBackground(String... params){String url = params[0];//從網絡獲取圖片Bitmap bitmap = getBitmapFromURL(url);if(bitmap != null){//將不在緩存的圖片加入緩存addBitmapToCache(url,bitmap)}return bitmap;}protected void onPostExecute(Bitmap bitmap){super.onPostExecute(bitmap);if(mImageView.getTag().equals(mUrl))mImageView.setImageBitmap(bitmap);} }另外,還需要在MyAdapter類中再初始化一個對象: public class MyAdapter extends BaseAdapter{private List<MyBean> mList;private LayoutInflater mInflater;private ImageLoader mImageLoader;public MyAdapter(Context context, List<MyBean> data){mList = data;mInflater = LayoutInflater.from(context);mImageLoader = new ImageLoader();}這樣就保證了只有一個LruCache《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的接上,进一步优化,LruCache缓存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android异步加载
- 下一篇: 接上,优化滚动的效率