用viewpager实现相册,由于加载的图片量很多,造成内存溢出。我在网上找了半天,然后修改了方法,在适配器中用了异步加载图片,并且每次用了还销毁了。但是随着图片的增加,内存占用量越来越大。直到图片为24张的时候,内存超过100M,程序就崩溃了。现在又在AndroidManifest.xml中加了android:largeHeap="true",加载31张图片没有问题。但是,我想知道,有没有减少内存使用的好办法。为什么我用的异步加载,删除了视图,却没有减少内存的使用量?
我简要说明一下我的做法,扫描得到某一个文件夹里的文件。得到文件的个数N,然后添加N个视图。在PagerAdapter的instantiateItem中异步加载图片。
public class MainActivity extends Activity {
private ViewPager viewPager;
private List<View> views;
File[] files;
String save_path ,path;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
viewPager = (ViewPager) findViewById(R.id.viewPager);
File defaultDir = Environment.getExternalStorageDirectory();
path = defaultDir.getAbsolutePath()+File.separator+"DCIM"+File.separator+"Screenshots"+File.separator;
File f_path = new File(path);
if(!f_path.exists()){
f_path.mkdir();
}
views = new ArrayList<View>();
files = f_path.listFiles();
int N = files.length;
Log.i("info", "N = "+N);
for (int i = 0; i < N; i++) {
ImageView image=new ImageView(this);
views.add(image);
}
PagerAdapter mPagerAdapter = new PagerAdapter(){
@Override
public Object instantiateItem(ViewGroup container, int position) {
ImageView view=(ImageView) views.get(position);
String item=files[position].getName();
Log.i("info", position+"图片名:"+item);
Bitmap bitmap = null;
try
{
File file = new File(path+item);
if(file.exists())
{
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig=null;
options.inPurgeable = true;
options.inInputShareable = true;
bitmap = BitmapFactory.decodeFile(path+item,options);
}
} catch (Exception e)
{
Log.i("info", "异常:"+e);
}
view.setImageBitmap(bitmap);
container.removeView(views.get(position));
container.addView(views.get(position));
return views.get(position);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return views.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0==arg1;
}
@Override
public void destroyItem(View container, int position, Object object) {
((ViewPager) container).removeView((View)object);
}
};
viewPager.setAdapter(mPagerAdapter);
}
}