Android:从SD卡显示图像

时间:2010-03-05 17:22:13

标签: android

我在市场上有一个应用程序,可以在库中显示用户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;
    } 
  } 

2 个答案:

答案 0 :(得分:2)

如果您还没有这样做,请集成Flurry或DroidDrop或其他东西来收集异常,因为它们可能会对您的问题有所了解。

此外:

  1. 请回收您的Views!您是在每次ImageView来电时创建一个新的getView(),这对您的GC情况没有帮助。
  2. 您在每次managedQuery()来电时都拨打相同的getView(),这太可怕了。请做一次。
  3. mCursor初始化之前,您似乎正在访问getCount()中的getView()
  4. column_index应始终以0的方式managedQuery(),因此您不需要使用getColumnIndexOrThrow()。即使您想要使用它,也只能在您进行单managedQuery()次呼叫时执行一次。
  5. 不管是否有任何问题都可以解决你的Droid Eris问题,我不能说。

答案 1 :(得分:0)

我尝试了上面的代码,只有在SD上只有.png和.jpg时它才能正常工作。否则它可以从mCursor中获得一些奇怪的路径,在这种情况下不会显示任何内容。