位图内存管理与位图回收

时间:2014-12-03 16:40:57

标签: android memory bitmap recycle

这非常棘手。我以为我已经解决了,因为它正在使用我的S2。但是在测试HTC One M7时问题已经出现。

我有一个欢迎屏幕类型的应用程序,当用户打开手机时,它会一直显示存储文件夹中的随机(或相同选定)图像。

我正准备OnResume中的图像视图,我正在调用我的图像绘制方法。

    protected void onResume() {
      super.onResume();
      if (isCallActive(this) == false) {
        changeImage(false);
      } else {
      }
    }

ChangeImage方法代码是:

    public void changeImage(Boolean vForce) {
      String pathV = null;
      SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0); // 0 - for private mode
      Boolean vPicChosen;
      vPicChosen = pref.getBoolean("PicChosen", false);
      if (vPicChosen == true) {
        pathV = pref.getString("PicURL", "NOPIC");
      } else pathV = "NOPIC";
      if (pathV == "NOPIC" || vForce == true) {
        pathV = randomPic();
      }
      imgFile = new File(pathV);

    if(imgFile.exists()) {
        img1 = (ImageView)findViewById(R.id.imageView);
        Display display = getWindowManager().getDefaultDisplay();
        float width = display.getWidth();
        float height = display.getHeight();
        if (reusedBitmap != null && !reusedBitmap.isRecycled()) {
            //reusedBitmap.recycle();
        }
        reusedBitmap = decodeSampledBitmapFromPath(pathV, (int)width, (int)height); 
        img1.setImageBitmap(reusedBitmap);

    }
    else
        Toast.makeText(this,  "no Image present", Toast.LENGTH_SHORT).show();

  }

现在使用此代码,每次我的应用程序呈现图像(相同或不同)时,内存堆增长3到6MB,具体取决于图像大小。在5-6个屏幕切换后,内存将超过50Mb,最终导致内存不足或应用程序被杀死。

所以我尝试了很多东西,最终通过在onStop方法中循环使用位图成功地保留了内存选项卡:

    @Override
protected void onStop() {
    Log.i("event","onStop");
    if (reusedBitmap != null && !reusedBitmap.isRecycled()) {
        reusedBitmap.recycle();
    }
}

正如我之前提到的,这曾经在我的S2上正常工作。

但在我的HTC One M7上,由于此调用,图像绘制错误

12-03 16:21:12.944:E / AndroidRuntime(25881):java.lang.RuntimeException:Canvas:尝试使用回收的位图android.graphics.Bitmap@41af3468

如果我从onStop中删除此行,则会出现内存增长问题。

有什么建议吗?

0 个答案:

没有答案