2016-10-06 8 views
0

私は、アプリケーションギャラリーを作っています。それはうまくいっていますが、遅いですし、いくつかの画像をクリックすると、メモリ不足エラーが発生します。ビットマップのメモリ不足エラーとフルスクリーンの画像

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; 
} 

}

だから、GridViewのはとても遅いですし、私は画像の読み込みのためのグライドを使用するように切り替えることを検討してくださいメモリエラー

+2

ビットマップオブジェクトに画像をロードする際に[Strange memory out]問題が発生する可能性があります(http://stackoverflow.com/questions/477572/strange-out-of-memory-issue-while-loading-an-画像からビットマップへのオブジェクト) – petey

+0

その重複したものはありません – fer

+0

どのように違うのか説明できますか? – petey

答えて

0

から抜け出すfullsecreenImageView 一部の画像をクリックした後に - https://github.com/bumptech/glide

これはキャッシュとメモリを処理します。

関連する問題