Android加载图片效率高(内存不足)

时间:2015-07-07 05:03:28

标签: android gridview imageview out-of-memory

我刚开始为Android编写应用程序。我有3个活动使用相同的xml布局,一个网格视图。他们还使用所有相同的适配器在每个网格项中显示imageview和textview。当你在第一个活动中选择一个对象时,你会到达第二个,然后到第三个。

首先我使用普通方法" imageView.setImageResource(drawableid)"。这不是一个真正的问题,但是当我将更多图像放入gridview时,我得到了一个内存错误。

所以我寻找一个解决方案。我从android开发站点尝试了解码位图,调整大小和异步任务等等。 另一件事是毕加索图书馆,使用" Picasso.with(mContext).load(imageURI).into(imageView);"将非常简单。但是毕加索对于gridview来说会慢下来。滚动时看起来很乱。有时一些图像无法加载。

当我打开活动几次时,所有元数据都会填满内存,应用程序崩溃。 我究竟做错了什么?当我把第一个活动留给第二个活动时,我可以自己释放记忆吗?

3 个答案:

答案 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后,您要求加载主图像。也可以在服务器上存储缩略图。