gpt4 book ai didi

Android内存泄漏,没有静态变量

转载 作者:行者123 更新时间:2023-11-30 04:12:09 24 4
gpt4 key购买 nike

我是 Android 开发新手,作为一个练习项目,我正在尝试制作一个可以拍照、将其保存到外部存储并在 ImageView 中显示的 Activity 。几乎一切似乎都在工作,但是,我似乎有内存泄漏。

当屏幕方向改变时,我相信 Activity 会被销毁,然后重新创建。为了继续显示图像,我将图像的路径作为字符串存储在 onSaveInstanceState 中的一个包中,并在 onResotreInstanceState 中重置图像。拍摄 5mp 图片,我可以旋转一次屏幕,然后在第二次旋转时,应用程序崩溃,LogCat 报告内存不足错误。使用较低分辨率的图像,我得到更多的旋转,但应用程序最终仍然崩溃并且我得到同样的错误。

我一直在阅读有关 android 内存泄漏的文章,所有内容似乎都在说不要使用静态 Drawable,它可以引用 View ,并防止 vm 释放内存。据我所知,我不会做任何会保留引用的事情。如果有人可以帮助我找到我的错误,我将不胜感激。这是代码:

public class CameraTestsActivity extends Activity {

private Uri fileUri;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

public void takePicture(View view){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

fileUri = getOutputImageFileUri();
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

startActivityForResult(intent, 0);
}

private static Uri getOutputImageFileUri() {
return Uri.fromFile(getOutputImageFile());
}

private static File getOutputImageFile(){
Log.d("CameraTestsActivity", "Storage state: " + Environment.getExternalStorageState());
if (Environment.getExternalStorageState().equals("mounted")){
File mediaStorageDirs = new File (Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures" + "/CameraTestsActivity");
if (! mediaStorageDirs.exists()){
if (! mediaStorageDirs.mkdirs()){
Log.d("CameraTestsActivity", "Failed to create directories");
mediaStorageDirs = null;
return null;
}
}

String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File imageFile = new File(mediaStorageDirs.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");
mediaStorageDirs = null;
return imageFile;


}
Log.d("CameraTestsActivity", "Storage state bad");
return null;
}



@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK){
if (requestCode == 0){
setImage();
}
}
else{
super.onActivityResult(requestCode, resultCode, data);
}
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
fileUri = Uri.parse(savedInstanceState.getString("uri"));
setImage();
super.onRestoreInstanceState(savedInstanceState);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString("uri", fileUri.toString());
super.onSaveInstanceState(outState);
}

private void setImage(){
ImageView image = (ImageView)findViewById(R.id.imageView1);
File file = new File(fileUri.toString().substring(7));
if (!file.exists())
Log.d("CameraTestsActivity", "File " + fileUri.toString().substring(7) + "does not exist");
image.setImageURI(fileUri);
}

}

最佳答案

在显示位图时,我们应该注意它的大小不要超过堆大小或 VM 预算。虽然你没有任何内存泄漏,但是当你改变你的方向时,可能需要一些时间来清理以前加载的位图,所以你会得到内存溢出错误。为避免此错误,请阅读此 How to display bitmap efficiently

关于Android内存泄漏,没有静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10679255/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com