Я загружаю изображения в виде сетки с сервера. Для этого я использую загрузчик Universal Image. Я использую загрузчик изображений внутри метода getview() адаптера. Он берет URL-адрес изображения из arraylist и загружает изображение с сервера. Изображения могут быть в 100-х годах. Я показываю вид сетки в фрагменте, поэтому для каждого фрагмента есть отдельный вид сетки. Когда я переключаюсь между несколькими фрагментами в течение длительного времени, я больше не получаю ошибку из памяти.
Рекомендуемое решение:
- Отпустите неиспользуемое растровое изображение.
Итак, я загружаю изображения, используя стороннюю библиотеку. Я просто передаю изображение в вызывающей функции, так как я могу освободить растровое изображение?
- Сделать кучу большой истиной в манифесте
Я думаю, что куча памяти динамична, и всякий раз, когда происходит увеличение памяти, сборщик мусора освобождает память.
3.Use UIL/Picasso/Glide, чтобы избежать утечек памяти
4.Code, чтобы освободить память фрагмента onDestroy() method()
private void unbindDrawables(View view)
{
if (view.getBackground() != null)
{
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup && !(view instanceof AdapterView))
{
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++)
{
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}
Я уже использую стороннюю библиотеку.
Вот код для моего класса gridViewAdapter.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
View view = convertView;
if (view == null)
{
view = inflater.inflate(R.layout.grid_item_photo, parent, false);
holder = new ViewHolder();
holder.imageView = (ImageView) view.findViewById(R.id.imgLoader);
holder.play = (ImageView) view.findViewById(R.id.play);
view.setTag(holder);
}
else
{
holder = (ViewHolder) view.getTag();
}
try{
if(IMAGES_LIST.get(position).getType().equals("video"))
{
holder.play.setVisibility(View.VISIBLE);
}
else
{
holder.play.setVisibility(View.GONE);
}
ImageLoader.getInstance().displayImage(AppConst.BASE_IMAGE_URL+IMAGES_LIST.get(position).getThumbnail(), holder.imageView, options, new SimpleImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
view.setClickable(true);
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
view.setClickable(true);
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
view.setClickable(false);
}
}, new ImageLoadingProgressListener() {
@Override
public void onProgressUpdate(String imageUri, View view, int current, int total) {
}
});
}catch(Exception e)
{
}
catch(OutOfMemoryError e)
{
}
return view;
}
static class ViewHolder {
ImageView imageView,play;
}
}