gpt4 book ai didi

java - 如何在android中使用imageloader释放位图内存?

转载 作者:IT王子 更新时间:2023-10-28 23:31:45 24 4
gpt4 key购买 nike

我正在将图像从服务器加载到 GridView 中。为此,我正在使用通用图像加载器。我在适配器的 getview() 方法中使用图像加载器。它从 arraylist 获取图像的 URL 并从服务器加载图像。图像可以是 100 的。我在 fragment 中显示 GridView ,因此每个 fragment 都有一个单独的 GridView 。当我长时间在多个 fragment 之间切换时,我不再出现内存不足的错误。

建议的解决方案:

  1. 释放未使用的位图。

所以我正在使用第三方库加载图像。我只是在调用函数中传递 ImageView ,那么如何释放位图?

  1. 在 list 中使堆变大

我猜堆内存是动态的,只要内存增加,垃圾收集器就会释放内存。

3.使用UIL/Picasso/Glide避免内存泄漏

4. fragment onDestroy()方法()释放内存的代码

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;

}


}

最佳答案

  1. 听起来你的 fragment 泄漏了——即使调用了 onDestroy,你的 fragment 和所有内容(包括位图)都保留在内存中。您可以使用 MAT + Heap 转储查看究竟是什么导致了泄漏(那里有很多可用的指南)。第一个嫌疑人应该是您从 fragment 中传递“this”的 fragment 类之外的单例。作为第一步,我将在 onDestroy 中清除您的 fragment 中的所有内容。

  2. 使“SimpleImageLoadingListener()”成为一个内部静态类,将 fragment 保存为 WeakReference - 这可能会减少泄漏(或至少其中一个泄漏)。

  3. 您应该将任何第三个 ImageLoader 用作具有一个 LRU 缓存 + 一个磁盘缓存的 Singleton。你可以在这里找到一些好的(Any best third party tool to cache image in Android?)

  4. list 中的“largeHeap”根本不应该出现在您的脑海中。一旦发生泄漏,那么在 OOM 之前,您将需要填满更大的堆。

关于java - 如何在android中使用imageloader释放位图内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31341833/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com