2015-08-12 1 views
1

Итак, у меня есть активность, которая представляет собой сетку изображений HD, которые сжимаются до примерно 64x64 пикселей. Я хочу, чтобы иметь возможность получить изображение, а затем загрузить их в действие, но я получаю сообщение об ошибке, в котором говорится, что память, которая требуется для загрузки всех изображений, намного выше, чем может обрабатывать эмулятор/телефон.Android: как загружать несколько изображений и звуков в активность без ошибки памяти

Я решил проблему, зайдя в Photoshop и сделав 64x64 изображения, но я видел приложения, которые запускают видео и имеют сотни изображений в представлении текущей деятельности. Как они компилируются со всей этой памятью в одном списке?

У меня есть другое приложение, которое представляет собой анимацию, которая воспроизводит полноэкранную анимацию с 20 картинками, но в Android Studio такая же ошибка связана с памятью.

Как загрузить 20 изображений в одном действии, не получая ошибку из памяти.

Код для деятельности с GridView @Override защищен недействительным OnCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.wallpapers);

//** 
    //Gridview, onclick of icon will open up dialog 
    //allows to SAVE, SET, CANCEL - not in that order 

    GridView gridview = (GridView) findViewById(R.id.gridview); 
    gridview.setAdapter(new ImageAdapter(this)); 

    gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, 
           int position, long id) { 
      Toast.makeText(Wallpaper.this, "Setting BG to ..." + position, 
        Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

Код для ImageAdapter

public class ImageAdapter extends BaseAdapter { 
private Context mContext; 

public ImageAdapter(Context c) { 
    mContext = c; 
} 

public int getCount() { 
    return mThumbIds.length; 
} 

public Object getItem(int position) { 
    return null; 
} 

public long getItemId(int position) { 
    return 0; 
} 

// create a new ImageView for each item referenced by the Adapter 
public View getView(int position, View convertView, ViewGroup parent) { 
    ImageView imageView; 
    if (convertView == null) { 
     // if it's not recycled, initialize some attributes 
     imageView = new ImageView(mContext); 
     imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setPadding(8, 8, 8, 8); 
    } else { 
     imageView = (ImageView) convertView; 
    } 

    imageView.setImageResource(mThumbIds[position]); 
    return imageView; 
} 

// references to our images 
private Integer[] mThumbIds = { 
     R.raw.es_1_pix, R.raw.es1_c, R.raw.es2_c, R.raw.es_1_pix 
      //.raw.es_1_pix,R.raw.es_1_pix,R.raw.es_1_pix,R.raw.es_1_pix,R.raw.es_1_pix 
     //R.raw.es2_c, R.raw.es3_c, R.raw.es4_c, 
     //R.raw.es5_c, R.raw.es6_c, R.raw.es7_c 
}; 
} 
+0

можете ли вы опубликовать часть кода адаптера gridview? – petey

+0

'есть сотни изображений в представлении текущей деятельности' - они этого не делают. Узнайте, как работает «ListView» или «RecyclerView». –

+0

Да, нужно видеть, что код адаптера, список 20 картинок - ничто. Что-то еще происходит. –

ответ

1

Есть несколько вещей, чтобы рассмотреть.

  1. Более легкое решение - используйте библиотеку управления изображениями, их много. Все они делают следующее:

Используйте WeakReference<Bitmap> везде, а не растровые изображения. WeakReference означает, что система может очищать изображения из памяти, когда памяти недостаточно.

Если вы показываете 20 64 * 64 изображений, чем убедитесь, что вы не храните 20 1024 * 1024 изображений в памяти, измените размер до 64 * 64 либо во время выполнения, либо вне приложения.

Вообще говоря, андроид может легко обрабатывать 20 изображений среднего размера (очевидно, не огромные). Если он высыпается, чем что-то не так с кодом.

UPDATE после того, как код был опубликован: изображения, которые у вас есть в файле ресурсов, огромны, уменьшите масштаб, и все будет хорошо.

+0

Эти изображения являются .jpg файлами. Могу ли я использовать методы Bitmap для работы с .jpg? – jakeinmn

3

Не уверен в звуке, но я знаю, что изображения должны использовать размер образца с inJustDecodeBounds=true.

public int calculateInSampleSize(BitmapFactory.Options options) { 

     DisplayMetrics displayMetrics = cxt.getResources().getDisplayMetrics(); 
     int reqWidth = displayMetrics.widthPixels; 

     final int height = options.outHeight; 
     final int width = options.outWidth; 

     double devCal2 = (height*1000)/width; 
     int reqHeight = (int) ((devCal2/1000)*reqWidth); 

     int inSampleSize = 1; 

     if (height > reqHeight || width > reqWidth) { 

      final int halfHeight = height/2; 
      final int halfWidth = width/2; 

      // Calculate the largest inSampleSize value that is a power of 2 and keeps both 
      // height and width larger than the requested height and width. 
      while ((halfHeight/inSampleSize) > reqHeight 
        && (halfWidth/inSampleSize) > reqWidth) { 
       inSampleSize *= 2; 
      } 
     } 

     return inSampleSize; 
    } 

    public Bitmap createBitmap(){ 

     BitmapFactory.Options options2 = new BitmapFactory.Options(); 
     options2.inJustDecodeBounds = true; 
     options2.inDither=true; 
     BitmapFactory.decodeFile(cxt.getExternalFilesDir(filepath) +"/companylogo.png",options2); 
     options2.inSampleSize = calculateInSampleSize(options2);//=32 
     options2.inJustDecodeBounds = false; 

     return BitmapFactory.decodeFile(cxt.getExternalFilesDir(filepath) +"/companylogo.png",options2); 
    } 

Для справки, пожалуйста, проверьте http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

0

Если вам действительно нужно полное HD изображение, которое вы могли бы вычислить, сколько места вам нужно, и загружать их в вид на один за другим, заменяющие другие с заполнителем изображением. Затем после загрузки одного изображения убедитесь, что система очищает это изображение из памяти. Но, как и большинство людей, сказал, что если сбой всего лишь из 20 изображений, это, вероятно, что-то еще.

Смежные вопросы