【问题标题】:Images taking too much memory图片占用太多内存
【发布时间】:2017-02-11 13:19:27
【问题描述】:

您好,我的代码非常简单,我的图片都被压缩了,所以没有人超过 50kb。当我启动我的应用程序时,加载了 1 个图像并且内存使用量约为 42mb,但是当我向下滚动到另一个图像时,每隔一个图像会导致内存使用量增加到 250mb。如何解决?这是我的代码,请我是初学者,所以尽量简单地解释一下。

import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;


public class CustomSwip extends PagerAdapter {
private int[] imageResources = {R.drawable.j1, R.drawable.jg2,R.drawable.jg3, R.drawable.jg4, R.drawable.jg5, R.drawable.jg6, R.drawable.jg7, R.drawable.jg8, R.drawable.jg9, R.drawable.jg10, R.drawable.jg11, R.drawable.jg12, R.drawable.jg13, R.drawable.jg14, R.drawable.jg15, R.drawable.jg16};
private Context ctx;
private LayoutInflater layoutInflater;

public CustomSwip(Context c) {
    ctx = c;
}

@Override
public int getCount() {

    return imageResources.length;
}


@Override
public Object instantiateItem(ViewGroup container, int position) {
    layoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View itemView = layoutInflater.inflate(R.layout.activity_custom_swip, container, false);
    ImageView imageView = (ImageView) itemView.findViewById(R.id.swip_image_view);
    imageView.setImageResource(imageResources[position]);
    container.addView(itemView);
    return itemView;
}


@Override
public void destroyItem(ViewGroup container, int position, Object object) {

}


@Override
public boolean isViewFromObject(View view, Object object) {

    return (view == object);
}

}

【问题讨论】:

  • 使用GlidePicasso库进行图片下载/缓存。
  • 内存使用是什么意思?它是您设备内存中用于您的应用程序的存储内存吗?
  • Android 监视器有一个主窗口,其中包含 logcat、内存、CPU、GPU 和网络监视器。在此窗口中,您可以选择要使用的设备和应用程序进程、终止应用程序、收集 dumpsys 系统信息以及创建正在运行的应用程序的屏幕截图和视频。它是来自 android 监视器的内存

标签: android image memory


【解决方案1】:

Universal Image Loadernostra13 的一个库,它有据可查并且被广泛使用并且以配置设置而闻名提供图像的加载。在其中,有一个选项可以加载 RGB_565 中的图像,这可以减少大约一半的内存消耗(实际上已经看到了结果)等等。

在显示选项中使用 .bitmapConfig(Bitmap.Config.RGB_565)。 RGB_565 中的位图消耗的内存是 ARGB_8888 中的 2 倍。

请查看WeakReferences 一次。它可以帮助调用垃圾收集器以获取内存密集型图像。

【讨论】:

    【解决方案2】:

    根据 setImageResource 的文档,

    这会在 UI 线程上进行位图读取和解码,这可能会导致延迟中断。如果这是一个问题,请考虑使用 setImageDrawable(android.graphics.drawable.Drawable) 或 setImageBitmap(android.graphics.Bitmap) 和 BitmapFactory。

    或者干脆使用图片加载库来延迟加载图片

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-17
      • 2015-10-14
      • 2013-07-18
      • 2013-07-11
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多