我在市场上有一个应用程序,可以在库中显示用户SD卡中的所有照片。最初我遇到内存不足问题,但通过增加BitmapFactory选项中的inSampleSize来缓解这些问题。但是,我仍然有间歇性的报告图像没有显示,在某些情况下根本没有。似乎有更大比例的Droid Eris用户遇到问题。以下是加载所有照片和附带的ImageAdapter的方法:
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;
}
}
答案 0 :(得分:2)
如果您还没有这样做,请集成Flurry或DroidDrop或其他东西来收集异常,因为它们可能会对您的问题有所了解。
此外:
Views
!您是在每次ImageView
来电时创建一个新的getView()
,这对您的GC情况没有帮助。managedQuery()
来电时都拨打相同的getView()
,这太可怕了。请做一次。mCursor
初始化之前,您似乎正在访问getCount()
中的getView()
。column_index
应始终以0
的方式managedQuery()
,因此您不需要使用getColumnIndexOrThrow()
。即使您想要使用它,也只能在您进行单managedQuery()
次呼叫时执行一次。不管是否有任何问题都可以解决你的Droid Eris问题,我不能说。
答案 1 :(得分:0)
我尝试了上面的代码,只有在SD上只有.png和.jpg时它才能正常工作。否则它可以从mCursor中获得一些奇怪的路径,在这种情况下不会显示任何内容。