我有一个市场上的应用程序,显示用户的SDcard在画廊中的所有照片。最初我遇到了内存不足的问题,但通过增加BitmapFactory选项中的inSampleSize来缓解这些问题。但是,我仍然有间歇性的图像报告不显示,在某些情况下根本没有。 Droid Eris用户似乎有更大的比例存在问题。下面是加载所有照片,并伴随ImageAdapter方法:Android:显示来自SDcard的图像
private void loadAllPhotos() {
setContentView(R.layout.add_pictures);
String[] projection = {MediaStore.Images.Thumbnails._ID};
cursor = managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,
projection,
null,
null,
MediaStore.Images.Thumbnails.IMAGE_ID);
column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID);
int size = cursor.getCount();
if (size == 0) {
Toast.makeText(thisContext, "Can't find pics on SDcard.", Toast.LENGTH_SHORT).show();
}
g = (Gallery) findViewById(R.id.gallery);
g.setAdapter(new ImageAdapter(this));
}
的ImageAdapter:
public class ImageAdapter extends BaseAdapter {
int mGalleryItemBackground;
public ImageAdapter(Context c) {
mContext = c;
TypedArray a = obtainStyledAttributes(R.styleable.Gallery1);
mGalleryItemBackground = a.getResourceId(R.styleable.Gallery1_android_galleryItemBackground, 0);
a.recycle();
}
public int getCount() {
int cursorCount = mCursor.getCount();
return cursorCount;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView i = new ImageView(mContext);
System.gc();
if (convertView == null) {
try {
String [] proj={MediaStore.Images.Media.DATA};
mCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,proj, null, null, null);
column_index = mCursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
mCursor.moveToPosition(position);
filename = mCursor.getString(column_index);
if (filename.endsWith(".jpg") || filename.endsWith(".png")) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 15;
Bitmap bm = BitmapFactory.decodeFile(filename, options);
i.setImageBitmap(bm);
i.setScaleType(ImageView.ScaleType.FIT_XY);
i.setLayoutParams(new Gallery.LayoutParams(150, 150));
i.setBackgroundResource(mGalleryItemBackground);
System.gc();
}
} catch (Exception e) {
}
}
return i;
}
}
非常感谢您的反馈。我已经使用自定义错误报告,允许用户在发生异常时向我发送堆栈跟踪信息。 我会做出你所建议的改变,看看事情进展如何。 – polyclef 2010-03-05 22:43:28