这非常棘手。我以为我已经解决了,因为它正在使用我的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中删除此行,则会出现内存增长问题。
有什么建议吗?