我有一个具有网格视图的片段。我在网格视图中放置70个图像。但是当我运行应用程序时,它会从内存中解脱出来。解决它吗?我应该将所有图像转换为位图吗? 这是我的片段类:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_games, container, false);
mDrawerList = (GridView) rootView.findViewById(R.id.list_slidermenu);
icons=new int[50];
for(int i=1 ;i<icons.length ;i++)
{
icon_id="@drawable/data_" + i;
icons[i]=getResources().getIdentifier(icon_id, null, MainActivity.PACKAGE_NAME);
Log.e("log",""+icons[i]);
}
navDrawerItems = new ArrayList<NavDrawerItem>();
for(int i=0 ;i<icons.length ;i++)
{
navDrawerItems.add(new NavDrawerItem(icons[i]));
}
adapter = new NavDrawerListAdapter(getActivity(),
navDrawerItems);
mDrawerList.setAdapter(adapter);
return rootView;
}
这是我的适配器类:
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater mInflater = (LayoutInflater)
context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.itemlist, null);
}
ImageView imgIcon = (ImageView) convertView.findViewById(R.id.icon);
imgIcon.setImageResource(navDrawerItems.get(position).getIcon());
// displaying count
// check whether it set visible or not
return convertView;
}
答案 0 :(得分:0)
由于Android严格只允许您从SDK分配特定数量的内存,因此您必须使用质量较低的图片或不使用尽可能多的图片(70为高值)。将它们加载到位图将增加您对内存的需求或至少保持不变。如果你真的想要加载70张图片,那么你必须考虑使用NDK(但这并不容易,而且我认为工作量太大了。)
答案 1 :(得分:0)
你必须在这里考虑几个事实。
如果70张图片给你一个OOM例外,那就意味着你的图片必须更大。但大多数时候,你不需要图像。您的图像为1024 * 1024像素,但您可以在100 * 100比例图像视图中显示它。在这种情况下,你必须找到所需的大小,并缩小图像,它不会浪费堆,图像也不会像素化。 read here
您必须使用某种加载技术,例如进行加载,而不是一次性将所有70加载到网格中。然后只有用户滚动网格时才会加载图像。它不会浪费你的记忆。
您已取消分配当前未在网格上显示的所有图片。
您必须为应用设置大堆,但不建议这样做,但必须在这些类型的应用中使用。
答案 2 :(得分:0)
当你的位图总和 1MB时,我无法理解如何耗尽内存。但是当你需要更多的Bitmaps内存时,有一种简单的方法可以克服垃圾收集器。 (我昨天找到了这个解决方案)。将每个位图转换为您从SDK分配的ByteBuffer。此ByteBuffer不计入您的应用程序的内存。守则可能如下所示:
ByteBuffer mByteBuffer = ByteBuffer.allocateDirect(w * h * 2); // w和h代表Bitmap的宽度和高度(格式:RGB_565)
mByteBuffer.order(ByteBuffer.nativeOrder);
mBitmap.copyPixelsToBuffer(mByteBuffer); //现在你的Bitmap存储在Java中的Buffer中,我们可以回收Bitmap。如果要显示此ByteBuffer,可以编写
mByteBuffer.position(0);
mOtherBitmap.copyPixelsFromBuffer(mByteBuffer),你的Bitmap已准备就绪。在我的案例(~5ms)中它真的很快
但是,只有当你的图像总和大于1MB
时,才会推荐这种方法