png加载失去了内存android

时间:2015-04-06 17:23:53

标签: android bitmap png android-memory

我有一个具有网格视图的片段。我在网格视图中放置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;
    }

3 个答案:

答案 0 :(得分:0)

由于Android严格只允许您从SDK分配特定数量的内存,因此您必须使用质量较低的图片或不使用尽可能多的图片(70为高值)。将它们加载到位图将增加您对内存的需求或至少保持不变。如果你真的想要加载70张图片,那么你必须考虑使用NDK(但这并不容易,而且我认为工作量太大了。)

答案 1 :(得分:0)

你必须在这里考虑几个事实。

  1. 如果70张图片给你一个OOM例外,那就意味着你的图片必须更大。但大多数时候,你不需要图像。您的图像为1024 * 1024像素,但您可以在100 * 100比例图像视图中显示它。在这种情况下,你必须找到所需的大小,并缩小图像,它不会浪费堆,图像也不会像素化。 read here

  2. 您必须使用某种加载技术,例如进行加载,而不是一次性将所有70加载到网格中。然后只有用户滚动网格时才会加载图像。它不会浪费你的记忆。

  3. 您已取消分配当前未在网格上显示的所有图片。

  4. 您必须为应用设置大堆,但不建议这样做,但必须在这些类型的应用中使用。

答案 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

时,才会推荐这种方法