Вопрос по android, image – Утечка памяти Android, без статических переменных

1

Я начинающий разработчик для Android, и, как учебный проект, я пытаюсь сделать что-то, что может сделать снимок, сохранить его во внешнем хранилище и отобразить в ImageView. Кажется, почти все работает, но у меня утечка памяти.

Когда ориентация экрана меняется, я считаю, что активность уничтожается, а затем воссоздается. Чтобы продолжить отображение изображения, я сохраняю путь к изображению в виде строки в комплекте в onSaveInstanceState и сбрасываю изображение в onResotreInstanceState. Делая 5-мегапиксельные снимки, я могу повернуть экран один раз, а затем при втором повороте приложение вылетает, и LogCat сообщает об ошибке нехватки памяти. С изображениями с более низким разрешением я получаю больше поворотов, но приложение все равно в конечном итоге падает, и я получаю ту же ошибку.

Я читал об утечках памяти на Android, и все, кажется, говорят, что не используют статические Drawables, которые могут иметь ссылки на представление и препятствовать освобождению памяти 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);
}

}

Ваш Ответ

2   ответа
0

чтобы найти утечки, вот несколько ссылок:link1, link2

Вы также можете попробовать вручную освободить предыдущее растровое изображение Activity, удалив его из вашего ImageView и вызвав Bitmap.recycle () при вызове onStop () вашей Activity, так как до Honycomb время, когда резервный буфер Bitmap может быть выпущен довольно неопределенным.

Error: User Rate Limit Exceeded Chris
1

чтобы его размер не превышал размер кучи или, скажем, бюджет виртуальной машины. Хотя утечки памяти у вас нет, но при изменении ориентации может потребоваться некоторое время для очистки ранее загруженного растрового изображения, чтобы вы получили ошибку переполнения памяти. Чтобы избежать этой ошибки, пожалуйста, прочитайте этоКак эффективно отображать растровое изображение

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Chris
Error: User Rate Limit Exceeded

Похожие вопросы