2016-10-06 8 views
0

Je fais une galerie d'application. Il a travaillé, mais si lent et après que je clique dans certaines images, il est hors de faire une erreur de mémoire.erreur de dépassement de mémoire avec bitmap et une image en plein écran

FullScreenImageAdapter.java

public class FullScreenImageAdapter extends PagerAdapter { 

private Activity _activity; 
private ArrayList<String> _imagePaths; 
private LayoutInflater inflater; 

// constructor 
public FullScreenImageAdapter(Activity activity, 
     ArrayList<String> imagePaths) { 
    this._activity = activity; 
    this._imagePaths = imagePaths; 
} 

@Override 
public int getCount() { 
    return this._imagePaths.size(); 
} 

@Override 
public boolean isViewFromObject(View view, Object object) { 
    return view == ((RelativeLayout) object); 
} 

@Override 
public Object instantiateItem(ViewGroup container, int position) { 
    TouchImageView imgDisplay; 
    Button btnClose; 

    inflater = (LayoutInflater) _activity 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View viewLayout = inflater.inflate(R.layout.layout_fullscreen_image, container, 
      false); 

    imgDisplay = (TouchImageView) viewLayout.findViewById(R.id.imgDisplay); 
    btnClose = (Button) viewLayout.findViewById(R.id.btnClose); 

    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    //BitmapFactory.decodeFile(pathToImage, bmOptions); 
    int photoW = options.outWidth; 
    int photoH = options.outHeight; 
    int scaleFactor = Math.min(photoW/50, photoH/50); 

    options.inJustDecodeBounds = false; 
    options.inSampleSize = 8; 
    options.inPurgeable = true; 

    // options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
    Bitmap bitmap = BitmapFactory.decodeFile(_imagePaths.get(position), options); 
    imgDisplay.setImageBitmap(bitmap); 

    // close button click event 

    ((ViewPager) container).addView(viewLayout); 

    return viewLayout; 
} 

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    ((ViewPager) container).removeView((RelativeLayout) object); 

} 

}

public class FullScreenViewActivity extends Activity{ 

private Utils utils; 
private FullScreenImageAdapter adapter; 
private ViewPager viewPager; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_fullscreen_view); 

    viewPager = (ViewPager) findViewById(R.id.pager); 

    utils = new Utils(getApplicationContext()); 

    Intent i = getIntent(); 
    int position = i.getIntExtra("position", 0); 

    adapter = new FullScreenImageAdapter(FullScreenViewActivity.this, 
      utils.getFilePaths()); 

    viewPager.setAdapter(adapter); 

    // displaying selected image first 
    viewPager.setCurrentItem(position); 
    //adapter.destroyItem(viewPager,position,i); 


} 

}

GridViewActivity

public class GridViewActivity extends Activity { 

private Utils utils; 
private ArrayList<String> imagePaths = new ArrayList<String>(); 
private GridViewImageAdapter adapter; 
private GridView gridView; 
private int columnWidth; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_grid_view); 

    gridView = (GridView) findViewById(R.id.grid_view); 

    utils = new Utils(this); 

    // Initilizing Grid View 
    InitilizeGridLayout(); 

    // loading all image paths from SD card 
    imagePaths = utils.getFilePaths(); 

    // Gridview adapter 
    adapter = new GridViewImageAdapter(GridViewActivity.this, imagePaths, 
      columnWidth); 

    // setting grid view adapter 
    gridView.setAdapter(adapter); 
} 

private void InitilizeGridLayout() { 
    Resources r = getResources(); 
    float padding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 
      AppConstant.GRID_PADDING, r.getDisplayMetrics()); 

    columnWidth = (int) ((utils.getScreenWidth() - ((AppConstant.NUM_OF_COLUMNS + 1) * padding))/AppConstant.NUM_OF_COLUMNS); 

    gridView.setNumColumns(AppConstant.NUM_OF_COLUMNS); 
    gridView.setColumnWidth(columnWidth); 
    gridView.setStretchMode(GridView.NO_STRETCH); 
    gridView.setPadding((int) padding, (int) padding, (int) padding, 
      (int) padding); 
    gridView.setHorizontalSpacing((int) padding); 
    gridView.setVerticalSpacing((int) padding); 
} 

}

-

public class GridViewImageAdapter extends BaseAdapter { 

private Activity _activity; 
private ArrayList<String> _filePaths = new ArrayList<String>(); 
private int imageWidth; 

public GridViewImageAdapter(Activity activity, ArrayList<String> filePaths, 
     int imageWidth) { 
    this._activity = activity; 
    this._filePaths = filePaths; 
    this.imageWidth = imageWidth; 
} 

@Override 
public int getCount() { 
    return this._filePaths.size(); 
} 

@Override 
public Object getItem(int position) { 
    return this._filePaths.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ImageView imageView; 
    if (convertView == null) { 
     imageView = new ImageView(_activity); 
    } else { 
     imageView = (ImageView) convertView; 
    } 

    // get screen dimensions 
    Bitmap image = decodeFile(_filePaths.get(position), imageWidth, 
      imageWidth); 


    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
    imageView.setLayoutParams(new GridView.LayoutParams(imageWidth, 
      imageWidth)); 
    imageView.setImageBitmap(image); 



    // image view click listener 
    imageView.setOnClickListener(new OnImageClickListener(position)); 

    return imageView; 
} 

class OnImageClickListener implements OnClickListener { 

    int _postion; 

    // constructor 
    public OnImageClickListener(int position) { 
     this._postion = position; 
    } 

    @Override 
    public void onClick(View v) { 
     // on selecting grid view image 
     // launch full screen activity 
     Intent i = new Intent(_activity, FullScreenViewActivity.class); 
     i.putExtra("position", _postion); 
     _activity.startActivity(i); 
    } 

} 

/* 
* Resizing image size 
*/ 
public static Bitmap decodeFile(String filePath, int WIDTH, int HIGHT) { 
    try { 

     File f = new File(filePath); 

     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 
     BitmapFactory.decodeStream(new FileInputStream(f), null, o); 

     final int REQUIRED_WIDTH = WIDTH; 
     final int REQUIRED_HIGHT = HIGHT; 
     int scale = 1; 
     while (o.outWidth/scale/2 >= REQUIRED_WIDTH 
       && o.outHeight/scale/2 >= REQUIRED_HIGHT) 
      scale *= 2; 

     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize = scale; 
     return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

}

Ainsi, le gridview est si lent et après cliquez sur certaines images, les fullsecreenImageView je sortirai d'erreur de mémoire

+2

double possible de [étrange de problème de mémoire lors du chargement d'une image à un objet Bitmap] (http://stackoverflow.com/questions/477572/strange-out-of-memory-issue-while-loading-an- l'image à un bitmap objet) – petey

+0

pas son pas dupliquer son diferent – fer

+0

Pouvez-vous expliquer comment il est différent? – petey

Répondre

0

envisager de passer à l'aide de glissement pour le chargement d'images - https://github.com/bumptech/glide

Il se chargera de la mise en cache et de la mémoire pour vous.