【发布时间】:2015-09-29 06:22:36
【问题描述】:
我正在将图像从服务器加载到网格视图中。为此,我正在使用通用图像加载器。我在适配器的 getview() 方法中使用图像加载器。它从 arraylist 获取图像的 URL 并从服务器加载图像。图像可以是 100 的。我在片段中显示网格视图,因此对于每个片段都有一个单独的网格视图。当我长时间在多个片段之间切换时,我不再出现内存不足的错误。
建议的解决方案:
- 释放未使用的位图。
所以我正在使用第三方库加载图像。我只是在调用函数中传递图像视图,那么如何释放位图?
- 在清单中使堆变大
我猜堆内存是动态的,只要内存增加,垃圾收集器就会释放内存。
3.使用UIL/Picasso/Glide避免内存泄漏
4.片段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;
}
}
【问题讨论】:
-
您在哪个 android 版本上运行应用程序?
-
@TechGuy andorid kitkat
-
我听说每个安卓版本的内存管理是不同的。并使用图像缓存来提高性能。
标签: java android performance memory out-of-memory