2015-04-06 2 views
0

У меня есть фрагмент с сеткой. Я помещаю 70 изображений в сетку view.but, когда я запускаю приложение, оно выходит из памяти. Как решить его? конвертировать все изображения в растровые изображения? это мой фрагмент класс:png загрузка выйдет из памяти android

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.fragment_games, container, false); 

    mDrawerList = (GridView) rootView.findViewById(R.id.list_slidermenu); 

    icons=new int[50]; 
    for(int i=1 ;i<icons.length ;i++) 
    { 
     icon_id="@drawable/data_" + i; 
     icons[i]=getResources().getIdentifier(icon_id, null, MainActivity.PACKAGE_NAME); 
     Log.e("log",""+icons[i]); 
    } 
    navDrawerItems = new ArrayList<NavDrawerItem>(); 
    for(int i=0 ;i<icons.length ;i++) 
    { 
     navDrawerItems.add(new NavDrawerItem(icons[i])); 
    } 
    adapter = new NavDrawerListAdapter(getActivity(), 
      navDrawerItems); 
    mDrawerList.setAdapter(adapter); 

    return rootView; 
} 

и это мой адаптер класс:

public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      LayoutInflater mInflater = (LayoutInflater) 
        context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
      convertView = mInflater.inflate(R.layout.itemlist, null); 
     } 
     ImageView imgIcon = (ImageView) convertView.findViewById(R.id.icon); 

     imgIcon.setImageResource(navDrawerItems.get(position).getIcon()); 

     // displaying count 
     // check whether it set visible or not 
     return convertView; 
    } 

ответ

0

Здесь вы должны рассмотреть несколько фактов.

  1. Если 70 изображений дали вам исключение OOM, это значит, что ваши изображения должны быть большего размера. Но большую часть времени вам не нужен образ, какой он есть. Ваше изображение составляет 1024 * 1024 пикселя, но вы показываете его в виде изображения масштаба 100 * 100. В таких случаях вы должны найти требуемый размер и уменьшить изображение, где он не содержит кучу, а также изображение не получает pixalated. read here

  2. Вы должны использовать какую-то технику загрузки, такую ​​как прогрессирующая загрузка, а не загрузка всех 70 одновременно в сетку. Тогда изображения будут загружаться, когда только пользователь прокручивает сетку. Это не потеряет память.

  3. Вы выделили все изображения, которые в настоящее время не отображаются в сетке для данного конкретного момента.

  4. Вы должны установить большую кучу для приложения, хотя оно не рекомендуется, но оно должно использоваться в таких приложениях.

+0

каждое изображение составляет 200 * 200 пикселей и имеет значение 6kb. У вас есть файл png. Так вы говорите, что конвертируете все доступные файлы в растровое изображение в качестве ссылки, а затем устанавливаете изображение? – rowwwss

+0

где вы сохраняете эти картинки? в SD-карте? В любом случае вам не нужно преобразовывать их в растровые изображения. Просто загрузите их как растровое изображение. –

+0

Место не имеет значения, вы можете загрузить png как растровое изображение. Затем установите его в изображение. –

0

Как Android строго только позволяет выделить определенный объем памяти из SDK, вы должны использовать более низкое качество картинку или не так много изображений (70 - высокое значение). Загрузка их в растровые изображения увеличит вашу потребность в памяти или, по крайней мере, останется прежней. Если вы действительно хотите загрузить 70 снимков такой большой, как в то время, когда вы должны рассмотреть возможность использования NDK (но это непросто, и здесь я думаю, что слишком много работы).

+0

все 70 изображений имеет 1mb value.they небольшие наклейки – rowwwss

+0

и .. 70MB, к сожалению, слишком много. Я могу получить около 35 МБ ОЗУ на моем Huawei, прежде чем я получу проблемы. –

+0

Нет изображения. Это изображение составляет 200 * 200 пикселей и имеет значение 6 килобайт. Их сумма составляет 1 м. – rowwwss

0

Я не могу понять, как вы можете РУНН из памяти, когда сумма растрового является 1Мб. Но есть простой способ преодолеть сборщик мусора, когда вам нужно больше памяти для битмапов. (Вчера я нашел это решение). Преобразуйте каждый Bitmap в ByteBuffer, который вы выделяете из SDK. Этот ByteBuffer не учитывает память вашего приложения. Код может выглядеть следующим образом:


ByteBuffer mByteBuffer = ByteBuffer.allocateDirect (ш * г * 2); // w и h обозначает ширину и высоту вашего растрового изображения (формат: RGB_565)

mByteBuffer.order (ByteBuffer.nativeOrder);

mBitmap.copyPixelsToBuffer (mByteBuffer); // Теперь ваш Bitmap хранится в буфере из Java, и мы можем переработать Bitmap. Когда вы хотите отобразить этот ByteBuffer, вы можете написать

mByteBuffer.position (0);

mOtherBitmap.copyPixelsFromBuffer (mByteBuffer) и ваше растровое изображение готовы к работе.Это действительно быстро в моем случае (~ 5мс)

Но я рекомендую этот METHODE только тогда, когда ваши изображения сумма больше, чем 1 МБ

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