2015-07-07 3 views
0

Я просто запускаю приложение для Android. У меня есть 3 действия, которые используют один и тот же макет xml, вид сетки. Они также используют все тот же адаптер, чтобы показывать изображение и текстовое представление в каждом элементе сетки. Когда вы выбираете объект в первом действии, вы переходите ко второму, а затем к третьему.Android загрузка изображений эффективная (из памяти)

Сначала я использовал обычный метод «imageView.setImageResource (drawableid)». Это была не проблема, но когда я помещал больше изображений в gridview, я получил ошибку outofmemory.

Так что я ищу решение. Я попробовал вещь с сайта разработчика Android с декодированием растрового изображения, изменения размера и задачи Async и так далее. Другая вещь была библиотека picasso, которая была бы очень простой с «Picasso.with (mContext) .load (imageURI) .into (imageView);». Но picasso ist замедляется для gridview. Это выглядит перепутано во время прокрутки. И иногда некоторые изображения не были загружены.

Все метки заполняют память, и приложение падает, когда я открываю действия пару раз. Что я делаю неправильно? Могу ли я освободить память самостоятельно, когда я оставлю первое действие второму?

+0

Я думаю tghe проблема в адаптере GridView. Я думаю, вы не будете повторно использовать представления. Показать код. –

+0

@Andre, вы должны использовать recyclerview, как сказал джигш. Пожалуйста, взгляните на это тоже. https://developer.android.com/training/material/lists-cards.html –

+0

также спасибо @SumighoshCharuvil, отлично работает. –

ответ

0

Был ответ в SO об освобождении памяти вручную. Я не мог найти его сейчас, так что я вставив ответ я реализующий

Определить следующую функцию

//To free up memory taken by adapterViews and others 
private void unbindDrawables(View view) { 
    if (view.getBackground() != null) 
     view.getBackground().setCallback(null); 

    if (view instanceof ImageView) { 
     ImageView imageView = (ImageView) view; 
     imageView.setImageBitmap(null); 
    } else if (view instanceof ViewGroup) { 
     ViewGroup viewGroup = (ViewGroup) view; 
     for (int i = 0; i < viewGroup.getChildCount(); i++) 
      unbindDrawables(viewGroup.getChildAt(i)); 

     if (!(view instanceof AdapterView)) 
      viewGroup.removeAllViews(); 
    } 
} 

затем в вашем использовании метода OnDestroy

unbindDrawables(findViewById(R.id.view_to_unbind)); 
System.gc(); 

Это остановленного мое приложение из сбой при изменении ориентации.

0

Вы загружаете изображение в виде сетки не в главном изображении после нажатия на gridview, вы делаете запрос на загрузку основного изображения. Также сохраняйте миниатюры на сервере.

+0

Я не хочу загружать большие изображения. В gridview отображаются некоторые виды разных машин. Они должны быть хорошо видны с самого начала, потому что вы принимаете только решение, которое вы хотите. Я думаю, что крошечный эскиз не подходит для этого. –

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