Жизненный цикл активности - onCreate вызывается при каждой переориентации - PullRequest
52 голосов
/ 01 октября 2011

У меня есть простое действие, которое загружает растровое изображение в onCreate.Я обнаружил, что, если я поверну устройство, я смогу увидеть из журналов, что onCreate снова вызвал.Фактически, поскольку все переменные экземпляра снова установлены в значения по умолчанию, я знаю, что вся активность была восстановлена ​​заново.

После двухкратного поворота я получаю FC, поскольку для растрового изображения может быть выделено недостаточно памяти.(Все ли экземпляры активности еще где-то живы? Или GC недостаточно быстро очищается?)

@Override
public void onCreate(Bundle savedInstanceState) {
    File externalStorageDir = Environment.getExternalStorageDirectory();
    File picturesDir = new File(externalStorageDir, "DCIM/Camera");
    File[] files = picturesDir.listFiles(new FilenameFilter(){
        public boolean accept(File dir, String name) {
            return name.toLowerCase().endsWith(".jpg");
        }});
    if (files.length > 0) {
        Bitmap bm = BitmapFactory.decodeStream(new FileInputStream(files[0]));
        ImageView view = (ImageView) findViewById(R.id.photo);
        view.setImageBitmap(bm);
    }
}

Из всего, что я прочитал, onCreate должен вызываться один раз за время существования приложения.Я ошибаюсь по этому поводу?Как переориентация устройства может привести к воссозданию активности?

Ответы [ 12 ]

0 голосов
/ 28 июля 2016

У меня была та же проблема, в которой мой onCreate вызывается несколько раз, когда изменяется ориентация экрана.Моя проблема была решена, когда я добавил android:configChanges="orientation|keyboardHidden|screenSize" в тег activity в manifest

0 голосов
/ 28 июня 2016

У меня была такая же проблема, и я сделал обходной путь

Определение логической переменной didLoad со значением false

private boolean didLoad = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);

    if (!this.didLoad){
        // Your code...
        this.didLoad = true;
    }
...