我刚开始为Android编写应用程序。我有3个活动使用相同的xml布局,一个网格视图。他们还使用所有相同的适配器在每个网格项中显示imageview和textview。当你在第一个活动中选择一个对象时,你会到达第二个,然后到第三个。
首先我使用普通方法" imageView.setImageResource(drawableid)"。这不是一个真正的问题,但是当我将更多图像放入gridview时,我得到了一个内存错误。
所以我寻找一个解决方案。我从android开发站点尝试了解码位图,调整大小和异步任务等等。 另一件事是毕加索图书馆,使用" Picasso.with(mContext).load(imageURI).into(imageView);"将非常简单。但是毕加索对于gridview来说会慢下来。滚动时看起来很乱。有时一些图像无法加载。
当我打开活动几次时,所有元数据都会填满内存,应用程序崩溃。 我究竟做错了什么?当我把第一个活动留给第二个活动时,我可以自己释放记忆吗?
答案 0 :(得分:4)
最佳解决方案是在您的应用中使用 RecyclerView https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html
答案 1 :(得分: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();
这已经阻止了我的应用在方向更改时崩溃。
答案 2 :(得分:0)
在网格视图中加载图像缩略图而不是主图像在点击gridview后,您要求加载主图像。也可以在服务器上存储缩略图。