【问题标题】:Android remove Bitmap from Memory when leave activity离开活动时Android从内存中删除位图
【发布时间】:2016-02-12 12:03:22
【问题描述】:

我正在开发一个需要图片库的应用。我正在将所有图像显示在网格视图中。当我触摸一个图像时,我希望它用触摸的图像全屏打开一个活动,这也在工作,但是当我回到网格并打开另一个图像时,内存消耗不断增长。我尝试将特征图像设置为nullBitmap.recycle() 并在活动上调用finish(),当我打开不同的图像时,这些似乎都无法阻止内存消耗的增加。

打开详细活动

Intent intent = new Intent(MainActivity.this, DetailActivity.class);
intent.putExtra("image", adapter.file[position].getPath());
//Start details activity
startActivity(intent);

特征图像活动

public class DetailActivity extends AppCompatActivity {
    private Intent intent = getIntent();
    private Bitmap featureImage;
    private ImageView featureView;
    private final String TAG ="Image Detail --";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        Bundle extras = getIntent().getExtras();

        final String imgPath = extras.getString("image");
        final BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
        bitmapOptions.inDensity = 2;
        bitmapOptions.inTargetDensity = 1;

        featureImage = BitmapFactory.decodeFile(imgPath, bitmapOptions );
        featureView = (ImageView) findViewById(R.id.featureImageView);
        featureView.setImageBitmap(featureImage);
    }

    @Override
    protected void onPause(){
        super.onPause();
        //featureImage = null;
        //featureView.setImageBitmap(null);
        //featureImage.recycle();
        this.finish();
    }
}

内存继续增长到大约 40MB,然后下降到 32MB,并以这种模式循环。

欢迎任何提示/建议。

【问题讨论】:

  • 看起来很正常。正在根据需要对对象进行垃圾收集。我会质疑在您的 OnPause 中调用 Finish,尽管旋转设备或接听电话等简单操作将完成活动。
  • 谢谢@Kuffs。所以你觉得没有问题?我也会看看onPause() 问题。我没有考虑过,但是我的应用程序仅由于其他功能而具有便携性,并且我更喜欢在按下设备上的主页按钮后返回主屏幕而不是单独的图像。

标签: android performance memory-management bitmap android-memory


【解决方案1】:

问题是您没有缩小图像以正确适应 ImageView。你有两个选择:

  1. 阅读并实施this lesson 中显示的内容。这种方法的好处是你只使用你需要的代码,缺点是它的工作量相当大。
  2. 使用像Glide 这样的库。它使用简单并且得到很好的支持。缺点是它确实为您的项目添加了许多您原本不会使用的方法,从而增加了 apk 的大小。

就个人而言,每当我必须显示图像时,我都会使用 Glide!

【讨论】:

  • 我已经尝试过选项一,并且有一个类似的实现,它使用异步任务和 lru 缓存用于我的初始网格视图,但对于单个图像页面似乎过度杀戮,因为我只想显示它然后 trow它离开。我会考虑选项二。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 2015-12-04
相关资源
最近更新 更多