Android 高效加载图像(内存不足)
Android loading images efficient (out of memory)
我刚开始为 Android 编写应用程序。我有 3 个 activity 使用相同的 xml 布局,一个网格视图。他们还使用所有相同的适配器在每个网格项中显示图像视图和文本视图。当您 select 第一个 activity 中的一个对象时,您会到达第二个,然后是第三个。
首先我使用了正常的方法"imageView.setImageResource(drawableid)"。这不是真正的问题,但是当我将更多图像放入 gridview 时,出现内存不足错误。
所以我寻找解决方案。我尝试了来自 android 开发站点的东西,包括解码位图、调整大小和异步任务等等。
另一件事是毕加索图书馆,"Picasso.with(mContext).load(imageURI).into(imageView);" 会非常简单。但是 picasso is to slow for the gridview。滚动时看起来很乱。有时有些图片加载不出来。
所有的方法都填满了内存,当我打开活动几次时,应用程序崩溃了。
我究竟做错了什么?把第一个activity留给第二个,我可以自己释放内存吗?
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();
这已阻止我的应用程序因方向更改而崩溃。
单击网格视图后,您在网格视图中加载图像缩略图而不是主图像,您发出加载主图像的请求。还将缩略图存储在服务器上。
最佳解决方案是在您的应用中使用 RecyclerView
https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html
我刚开始为 Android 编写应用程序。我有 3 个 activity 使用相同的 xml 布局,一个网格视图。他们还使用所有相同的适配器在每个网格项中显示图像视图和文本视图。当您 select 第一个 activity 中的一个对象时,您会到达第二个,然后是第三个。
首先我使用了正常的方法"imageView.setImageResource(drawableid)"。这不是真正的问题,但是当我将更多图像放入 gridview 时,出现内存不足错误。
所以我寻找解决方案。我尝试了来自 android 开发站点的东西,包括解码位图、调整大小和异步任务等等。 另一件事是毕加索图书馆,"Picasso.with(mContext).load(imageURI).into(imageView);" 会非常简单。但是 picasso is to slow for the gridview。滚动时看起来很乱。有时有些图片加载不出来。
所有的方法都填满了内存,当我打开活动几次时,应用程序崩溃了。 我究竟做错了什么?把第一个activity留给第二个,我可以自己释放内存吗?
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();
这已阻止我的应用程序因方向更改而崩溃。
单击网格视图后,您在网格视图中加载图像缩略图而不是主图像,您发出加载主图像的请求。还将缩略图存储在服务器上。
最佳解决方案是在您的应用中使用 RecyclerView https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html