`
hutuanle
  • 浏览: 9651 次
文章分类
社区版块
存档分类
最新评论

Android使用缓存优化ListView

 
阅读更多

摘自:http://blog.sina.com.cn/s/blog_5fc933730101apwl.html

ListView调用Adapter的getView方法获取每一个Item布局,将这些已经获得的Item布局放入缓存,将大大提高获取数据的效率,而且节省更多的流量,将数据进行缓存有两种方法是,一种是将内存缓存一种是sd卡缓存,在此分别进行演示。

sd卡缓存:

sd卡缓存是将下载的数据保存到sd卡中,当再次要获取数据时,首先要判断sd卡中是否存在,如果存在的话,就直接读取sd卡中的数据,如果不存在就从网上下载,然后保存到sd卡中

内存缓存:

内存优化是将获取到的数据存取到Map集合中,如果再次引用此数据,就直接从Map集合中获取,这样会导致一个问题,如果Map集合中的数据特别多,比如存取了100万条数据,这样有可能就会导致内存溢出。这是因为Map集合是强引用的集合,如何不把Map集合置为空的话,这个集合Java虚拟机就不会把它回收掉,当Map中的数据大小超过了内存大小就会导致内存溢出。为了避免这种异常我们要使用软引用softreference ,软引用和强引用的区别如下:

1. softreference 他是java虚拟机给我们提供的一个包装类型.
在包装类型里面的对象 一般情况下 ,java虚拟机会尽量长时间的保留这个对象
当java虚拟机内存不足的时候 java虚拟机就会回收 softreference里面的对象


2. hardreference默认new出来的对象 都是这种强应用的类型
只要一个对象还保留的有引用,他就不会被垃圾回收
Map<String,Bitmap> map;

核心代码:

sd卡缓存

  1. publicclassMyReadAdapterextendsBaseAdapter{
  2. privateList<CollectionEntry>entrys;
  3. publicMyReadAdapter(CollectionFeedfeeds){
  4. entrys=feeds.getEntries();
  5. }
  6. publicintgetCount(){
  7. returnentrys.size();
  8. }
  9. publicObjectgetItem(intposition){
  10. returnentrys.get(position);
  11. }
  12. publiclonggetItemId(intposition){
  13. returnposition;
  14. }
  15. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
  16. Viewview=infalter.inflate(R.layout.myread_item,null);
  17. finalImageViewiv=(ImageView)view.findViewById(R.id.book_img);
  18. //获取数据实体
  19. CollectionEntryce=entrys.get(position);
  20. //获取图片地址
  21. Stringiconurl=ce.getSubjectEntry().getLink("image",null).getHref();
  22. intstart=iconurl.lastIndexOf("/");
  23. intend=iconurl.length();
  24. finalStringiconname=iconurl.substring(start,end);
  25. //Environment.getExternalStorageDirectory()这个是sd卡目录
  26. Filefile=newFile(Environment.getExternalStorageDirectory(),iconname);
  27. //获取sd卡缓存
  28. if(file.exists()){
  29. iv.setImageURI(Uri.fromFile(file));
  30. Log.i(TAG,"使用sd卡图片");
  31. }else{
  32. newLoadImageAsynTask(newImageTaskCallback(){
  33. //图片获取之后
  34. publicvoidonImageLoaded(Bitmapbitmap){
  35. if(bitmap!=null){
  36. iv.setImageBitmap(bitmap);
  37. //把图片存到sd卡上
  38. if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
  39. try{
  40. Filefile=newFile(Environment.getExternalStorageDirectory(),iconname);
  41. FileOutputStreamfos=newFileOutputStream(file);
  42. bitmap.compress(CompressFormat.JPEG,100,fos);
  43. }catch(Exceptione){
  44. e.printStackTrace();
  45. }
  46. }
  47. }else{
  48. iv.setImageResource(R.drawable.book);
  49. }
  50. }
  51. //图片获取之前
  52. publicvoidbeforeImageLoaded(){
  53. iv.setImageResource(R.drawable.book);
  54. }
  55. }).execute(iconurl);
  56. }
  57. returnview;
  58. }
  59. }


内存缓存

    1. Map<String,SoftReference<Bitmap>>map;
    2. publicclassMyReadAdapterextendsBaseAdapter{
    3. privateList<CollectionEntry>entrys;
    4. publicMyReadAdapter(CollectionFeedfeeds){
    5. entrys=feeds.getEntries();
    6. }
    7. publicintgetCount(){
    8. returnentrys.size();
    9. }
    10. publicObjectgetItem(intposition){
    11. returnentrys.get(position);
    12. }
    13. publiclonggetItemId(intposition){
    14. returnposition;
    15. }
    16. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
    17. Viewview=infalter.inflate(R.layout.myread_item,null);
    18. finalImageViewiv=(ImageView)view.findViewById(R.id.book_img);
    19. //获取到数据的实体
    20. CollectionEntryce=entrys.get(position);
    21. //获取到图片的Url
    22. Stringiconurl=ce.getSubjectEntry().getLink("image",null).getHref();
    23. intstart=iconurl.lastIndexOf("/");
    24. intend=iconurl.length();
    25. finalStringiconname=iconurl.substring(start,end);
    26. //使用内存缓存
    27. if(map!=null&&map.get(iconname)!=null){
    28. iv.setImageBitmap(map.get(iconname).get());
    29. Log.i(TAG,"使用内存缓存");
    30. }
    31. else{
    32. newLoadImageAsynTask(newImageTaskCallback(){
    33. //图片获取之后
    34. publicvoidonImageLoaded(Bitmapbitmap){
    35. if(bitmap!=null){
    36. iv.setImageBitmap(bitmap);
    37. //存放到内存中,
    38. //软引用类型的bitmap
    39. map.put(iconname,newSoftReference<Bitmap>(bitmap));
    40. }else{
    41. iv.setImageResource(R.drawable.book);
    42. }
    43. }
    44. //图片获取之前
    45. publicvoidbeforeImageLoaded(){
    46. iv.setImageResource(R.drawable.book);
    47. }
    48. }).execute(iconurl);
    49. }
    50. returnview;
    51. }
    52. }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics