Android 在离开 Activity 时从内存中删除位图

标签 android performance memory-management bitmap android-memory

我正在开发一个需要图片库的应用程序。我正处于将所有图像显示在 GridView 中的位置。当我触摸一个图像时,我希望它用触摸的图像全屏打开一个 Activity ,这也有效,但是当我回到网格并打开另一个图像时,内存消耗不断增加。我已尝试将功能图像设置为 nullBitmap.recycle() 并在 Activity 上调用 finish() 似乎都没有停止当我打开不同的图像时内存消耗增加。

打开详细 Activity

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

特征图像 Activity

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,并以这种模式循环。

欢迎任何提示/建议。

memory monitor

最佳答案

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

  1. 阅读并实现 this lesson 中显示的内容.这种方法的好处是你只使用你需要的代码,缺点是它需要大量的工作来做一些本应简单明了的事情。
  2. 使用类似Glide 的库.它使用简单并且得到了很好的支持。缺点是它确实会向您的项目添加许多原本不会使用的方法,从而增加 apk 的大小。

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

关于Android 在离开 Activity 时从内存中删除位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33649842/

相关文章:

c# - 使用(新变量或声明新变量)给出参数在内存使用方面有区别吗?

c - 该乘法算法的时间复杂度是多少?

PHP方法逐 block 执行AES加密以节省内存使用

java - 从项目 Android studio 中删除额外的 android.jar

Android 深层链接不适用于 https

android - JobScheduler API 是否过度设计用于闹钟应用程序?

performance - 为什么使用 HT 的并行编译性能比不使用 HT 时差?

c - 为什么 `realloc` 在可能的情况下不会就地重新分配?

c - 链接器如何生成最终的虚拟内存地址?

android - 共享偏好内容提供者