listView加载几百张图片不出现OOM的方法

转载 2016年05月30日 14:43:03
  1. package com.example.listviewdemo;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Collections;  
  5. import java.util.LinkedList;  
  6. import java.util.List;  
  7.   
  8. import android.database.Cursor;  
  9. import android.graphics.Bitmap;  
  10. import android.os.Bundle;  
  11. import android.provider.MediaStore;  
  12. import android.view.View;  
  13. import android.view.ViewGroup;  
  14. import android.widget.BaseAdapter;  
  15. import android.widget.ImageView;  
  16. import android.widget.ListView;  
  17. import android.widget.TextView;  
  18.   
  19. import com.nostra13.universalimageloader.core.DisplayImageOptions;  
  20. import com.nostra13.universalimageloader.core.assist.ImageLoadingListener;  
  21. import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener;  
  22. import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;  
  23. import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;  
  24. import com.smalt.smaltmap.utils.GlobalConstant;  
  25.   
  26. /** 
  27.  *  
  28.  * @Title: 
  29.  * @Description:ListView显示大量图片 
  30.  * @Copyright: Copyright (c) 2014 
  31.  * @Company:  
  32.  * @author: Administrator 
  33.  * @version: 1.0.0.0 
  34.  * @Date: 2014-2-14 
  35.  */  
  36. public class MainActivity01 extends AbsListViewBaseActivity {  
  37.     DisplayImageOptions options; // 配置图片加载及显示选项  
  38.     ListView lvShow;  
  39.     /** 
  40.      * 存储图片地址 
  41.      */  
  42.     ArrayList<String> listImgPath;  
  43.     String[] imageUriArray;  
  44.   
  45.     @Override  
  46.     protected void onCreate(Bundle savedInstanceState) {  
  47.         super.onCreate(savedInstanceState);  
  48.         setContentView(R.layout.activity_main);  
  49.         lvShow = (ListView) findViewById(R.id.lv_show);  
  50.         // 扫描内存中图片并存入list  
  51.   
  52.         listImgPath = getImgPathList();  
  53.         if (listImgPath.size() < 1) {  
  54.             GlobalConstant.i("sd卡中无图片");  
  55.         } else {  
  56.             // list转成数组  
  57.             imageUriArray = (String[]) listImgPath  
  58.                     .toArray(new String[listImgPath.size()]);  
  59.             // 配置图片加载及显示选项(还有一些其他的配置,查阅doc文档吧)  
  60.             options = new DisplayImageOptions.Builder()  
  61.                     .showStubImage(R.drawable.ic_launcher) // 在ImageView加载过程中显示图片  
  62.                     .showImageForEmptyUri(R.drawable.ic_launcher) // image连接地址为空时  
  63.                     .showImageOnFail(R.drawable.ic_launcher) // image加载失败  
  64.                     .cacheInMemory(true// 加载图片时会在内存中加载缓存  
  65.                     .cacheOnDisc(true// 加载图片时会在磁盘中加载缓存  
  66.                     .displayer(new RoundedBitmapDisplayer(20)) // 设置用户加载图片task(这里是圆角图片显示)  
  67.                     .build();  
  68.             // 加载适配器  
  69.             lvShow.setAdapter(new AdapterList());  
  70.         }  
  71.   
  72.     }  
  73.       
  74.   
  75.     @Override  
  76.     public void onBackPressed() {  
  77.         AnimateFirstDisplayListener.displayedImages.clear();  
  78.         super.onBackPressed();  
  79.     }  
  80.   
  81.     /** 
  82.      *  
  83.      * 获取图片地址列表 
  84.      *  
  85.      * @return list 
  86.      */  
  87.     private ArrayList<String> getImgPathList() {  
  88.         ArrayList<String> list = new ArrayList<String>();  
  89.         Cursor cursor = getContentResolver().query(  
  90.                 MediaStore.Images.Media.EXTERNAL_CONTENT_URI,  
  91.                 new String[] { "_id""_data" }, nullnullnull);  
  92.         while (cursor.moveToNext()) {  
  93.             list.add(cursor.getString(1));// 将图片路径添加到list中  
  94.         }  
  95.         cursor.close();  
  96.         return list;  
  97.     }  
  98.   
  99.     /** 图片加载监听事件 **/  
  100.     private static class AnimateFirstDisplayListener extends  
  101.             SimpleImageLoadingListener {  
  102.   
  103.         static final List<String> displayedImages = Collections  
  104.                 .synchronizedList(new LinkedList<String>());  
  105.   
  106.         @Override  
  107.         public void onLoadingComplete(String imageUri, View view,  
  108.                 Bitmap loadedImage) {  
  109.             if (loadedImage != null) {  
  110.                 ImageView imageView = (ImageView) view;  
  111.                 boolean firstDisplay = !displayedImages.contains(imageUri);  
  112.                 if (firstDisplay) {  
  113.                     FadeInBitmapDisplayer.animate(imageView, 500); // 设置image隐藏动画500ms  
  114.                     displayedImages.add(imageUri); // 将图片uri添加到集合中  
  115.                 }  
  116.             }  
  117.         }  
  118.     }  
  119.   
  120.     /** 
  121.      *  
  122.      * @Title: 
  123.      * @Description:listview适配器 
  124.      * @Copyright: Copyright (c) 2014 
  125.      * @Company:  
  126.      * @author: Administrator 
  127.      * @version: 1.0.0.0 
  128.      * @Date: 2014-2-14 
  129.      */  
  130.     class AdapterList extends BaseAdapter {  
  131.         private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();  
  132.   
  133.           
  134.   
  135.         @Override  
  136.         public int getCount() {  
  137.             // TODO Auto-generated method stub  
  138.             return imageUriArray.length;  
  139.         }  
  140.   
  141.         /** 
  142.          * 构造方法 
  143.          */  
  144.         public AdapterList() {  
  145.             // TODO Auto-generated constructor stub  
  146.         }  
  147.   
  148.           
  149.         @Override  
  150.         public Object getItem(int arg0) {  
  151.             // TODO Auto-generated method stub  
  152.             return arg0;  
  153.         }  
  154.   
  155.         /* 
  156.          * (non-Javadoc) 
  157.          *  
  158.          * @see android.widget.Adapter#getItemId(int) 
  159.          */  
  160.         @Override  
  161.         public long getItemId(int arg0) {  
  162.             // TODO Auto-generated method stub  
  163.             return arg0;  
  164.         }  
  165.   
  166.         /* 
  167.          * (non-Javadoc) 
  168.          *  
  169.          * @see android.widget.Adapter#getView(int, android.view.View, 
  170.          * android.view.ViewGroup) 
  171.          */  
  172.         @Override  
  173.         public View getView(int position, View convertView, ViewGroup parent) {  
  174.             ViewHolder holder;  
  175.             if (convertView == null) {  
  176.                 holder = new ViewHolder();  
  177.                 // 初始化绑定控件  
  178.                 convertView = getLayoutInflater().inflate(R.layout.layout_item, null);  
  179.                 holder.imgShow = (ImageView) findViewById(R.id.img_show);  
  180.                 holder.tvShow = (TextView) findViewById(R.id.tv_show);  
  181.                 // add to convertView  
  182.                 convertView.setTag(holder);  
  183.             } else {  
  184.                 holder = (ViewHolder) convertView.getTag();  
  185.             }  
  186.   
  187.             // 设置img,text具体显示的内容  
  188.   
  189.             holder.tvShow.setText("fuck" + (position));  
  190.   
  191.             imageLoader.displayImage(imageUriArray[position], holder.imgShow,  
  192.                     options, animateFirstListener);  
  193.             return convertView;  
  194.         }  
  195.     }  
  196.   
  197.     static class ViewHolder {  
  198.         ImageView imgShow;  
  199.         TextView tvShow;  
  200.     }  
  201. }  

demo下载:

https://drive.google.com/file/d/0B3vXJifsRl4bTk8wUFpyNk9lNEU/edit?usp=sharing

相关文章推荐

关于listview加载图片时oom的解决方案

在Android平台上面,应用程序OOM异常永远都是值得关注的问题。通常这一块也是程序这中的重点之一。这下我就如何解决OOM作一点简单的介绍。     首先,OOM就是内存溢出,即Out Of Me...

ListView异步加载图片,解决OOM

笔者在实训期间曾编写使用ListView异步加载图片的功能模块,笔者在编写这个模块时,在listview加载item的效率和解决OOM的问题上,笔者花了大量的时间,通过在网上找到的一些资料和自己整理,...

ListView item过多 造成视图超出界面 解决

根视图 竖向linearLayout 里面有几个。。。 一个listview 下面几个按钮什么的 发现listview item太多的时候,就把下面的按钮全部挤到屏幕外了 ,按不到啊,...

ListView的Item高度不确定,导致最后一条item中ImageView 加载图片时不能完全显示

聊天界面中,item中有图片和文字或者语音,每次加载之后都要让list view显示最后一条,正常情况下让listview.setselection(listview.getcount()-1)就可以...

关于listview加载图片时oom的解决方案

在Android平台上面,应用程序OOM异常永远都是值得关注的问题。通常这一块也是程序这中的重点之一。这下我就如何解决OOM作一点简单的介绍。     首先,OOM就是内存溢出,即Out Of Me...

ListView异步加载图片--图片缓存和错位问题解决方案

问题1: 加载太多的图片很容易造成OOM异常。一、图片缓存方法1:使用二级缓存 ->自己维护一个缓存区 只要有足够的内存,就一直保持对象,直到发现内存吃紧且没有Strong Ref时才回...

好用的单或多图片加载不会出现OOM

  • 2013年10月24日 10:29
  • 3.27MB
  • 下载

ANDROID图片加载时出现OOM的一般处理方法

众所周知,每个Android应用程序在运行时都有一定的内存限制,限制大小一般为16MB或24MB(视平台而定)。因此在开发应用时需要特别关注自身的内存使用量,而一般最耗内存量的资源,一般是图片、音频文...

listview加载bitmap报oom。读取图片用后台线程。

最近做的easyshow遇到问题不少,现在功能实现了,不过出现了新的问题。 模拟器上没有问题,不过真机上面,就会报oom错误,想想,估计是bitmap用了过后,没有回收。知道用 if(bitma...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:listView加载几百张图片不出现OOM的方法
举报原因:
原因补充:

(最多只允许输入30个字)